簡體   English   中英

SpringJUnit4ClassRunner應該初始化上下文多少次?

[英]How many times should SpringJUnit4ClassRunner initialize it's context?

據說

Test注釋告訴JUnit,可以將其附加到的public void方法作為測試用例運行。 為了運行該方法,JUnit首先構造一個新的類實例,然后調用帶注釋的方法。 測試拋出的任何異常將由JUnit報告為失敗。 如果未引發任何異常,則假定測試成功。

這可能意味着,對於每個@Test方法,應再次初始化上下文。 這個答案也證實了這一點: https : //stackoverflow.com/a/1564309/258483

同時,我在實驗中看到了相反的結果:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringJUnit4ClassRunnerDemo._Config.class)
public class SpringJUnit4ClassRunnerDemo {


    public static class Bean1 {
        {
            System.out.println("Bean1 constructor called");
        }
    }

    public static class Bean2 {

        {
            System.out.println("Bean2 constructor called");
        }

        private Bean1 bean1;

        public Bean1 getBean1() {
            return bean1;
        }

        @Autowired
        public void setBean1(Bean1 bean1) {
            this.bean1 = bean1;

            System.out.println("Bean2.bean1 property set");
        }
    }

    @Configuration
    public static class _Config {

        @Bean
        public Bean1 bean1() {
            return new Bean1();
        }

        @Bean
        public Bean2 bean2() {
            return new Bean2();
        }


    }

    @Autowired
    private Bean1 bean1;

    @Autowired
    private Bean2 bean2;


    @Test
    public void testBean1() {

        assertNotNull(bean1);

        System.out.println("testBean1() done");
    }

    @Test
    public void testBean2() {

        assertNotNull(bean2);

        assertSame(bean2.getBean1(), bean1);

        System.out.println("testBean2() done");
    }


}

該代碼輸出

Bean1 constructor called
Bean2 constructor called
Bean2.bean1 property set
testBean1() done
testBean2() done

這可能意味着上下文沒有在第二次測試之前第二次初始化。

什么是實際和正確的行為以及如何控制它?

如果要在測試方法之間重新加載Spring上下文,則需要使用@DirtiesContext批注: https : @DirtiesContext 。 html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM