首页 文章

想要使用共享的@ BeforeClass / @ AfterClass和Spring App Context运行许多jUnit测试类

提问于
浏览
0

我正在进行一些集成测试,在集成测试之前将数据加载到远程测试数据库中 . 但是,这是一个很多数据,所以我宁愿在我的所有集成测试之前只做一次 .

我已经使用@ BeforeClass / @ AfterClass使用@RunWith(Suite.class)和JUnitCore.runClasses()来运行我的所有测试类作为套件 . 但是,我仍然坚持如何让Spring自动装配设置和拆卸所需的资源 . 例:

public class AbstractTest {
    @Autowired
    private SessionFactory sf;

    @BeforeClass
    public static void setup() {
        sf.getCurrentSession().createQuery("make tables");
    }
}

但是sf总是为null,因为@BeforeClass需要从静态上下文运行 . 我也试过使用@ClassRule,如下所示:How to share JUnit BeforeClass logic among multiple test classes但没有变化;

如何获得一套测试类的@ BeforeClass / @ AfterClass功能,并在@ BeforeClass / @ AfterClass方法中获得Autowired资源?让它与@Parameterized一起运行会更好 .

1 回答

  • 1

    SpringJUnit4ClassRunner在自动装配之前调用BeforeClass . 在调用BeforeClass方法之后注入一个上下文,但是还没有注入 .

    from RunBeforeTestClassCallbacks : 
         public void evaluate() throws Throwable {
            for (FrameworkMethod before : befores) { -- call for BeforeClass methods
                before.invokeExplosively(target);
            }
            next.evaluate(); -- call DependencyInjectionTestExecutionListener 
                              --where context is injected
    }
    

    您可以尝试这个(而不是@BeforeClass使用来自InitializingBean的afterPropertiesSet - 它执行BeforeClass调用但在执行所有测试统计之前)

    public abstract class AbstractTest implements InitializingBean{
        @Autowired
        private SessionFactory sf;
    
        //@BeforeClass
        @Override
        public void afterPropertiesSet() throws Exception {
            sf.getCurrentSession().createQuery("make tables");
    }
    

    要么

    public abstract class AbstractTest {
    
    private static SessionFactory sf;
    
    @Autowired
    public void setSessionFactory (SessionFactory sf){
        AbstractTest.sf = sf;
        setup();
    }
    
    //@BeforeClass
    public static void setup() {
        sf.getCurrentSession().createQuery("make tables");
    }
    }
    

    无论如何,它都是一些解决方法,因为测试类的BeforeClass在spring上下文之前被细分 .


    变式2,更新

    @TestExecutionListeners(listeners = {AbstractTest.class, DependencyInjectionTestExecutionListener.class})
    public class AbstractTest extends AbstractTestExecutionListener {
    
    public static SessionFactory sf;
    
    @BeforeClass
    public static void setup() {
        sf.getCurrentSession().createQuery("make tables");
    }
    
    @Override
    public void beforeTestClass(TestContext testContext) throws Exception {
        sf = testContext.getApplicationContext().getBean(SessionFactory.class);
        super.beforeTestClass(testContext);
    }
    }
    

相关问题