【问题标题】:How many times should SpringJUnit4ClassRunner initialize it's context?SpringJUnit4ClassRunner 应该初始化它的上下文多少次?
【发布时间】:2015-08-11 08:38:26
【问题描述】:

said in manual,那个

Test 注释告诉 JUnit 公共 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 Test Context 框架只负责加载一次上下文,这是出于性能原因,因为加载上下文通常非常耗时。如果您真的想重新加载上下文,请将 @DirtiesContext 添加到您的测试方法或测试类中。

标签: java spring unit-testing junit


【解决方案1】:

如果要在测试方法之间重新加载 Spring 上下文,则需要使用 @DirtiesContext 注释:https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/annotation/DirtiesContext.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 2014-06-25
    相关资源
    最近更新 更多