当前位置: 首页 > 知识库问答 >
问题:

希望使用共享的@BeforeClass/@AfterClass和Spring应用程序上下文运行许多jUnit测试类

狄鸿禧
2023-03-14

我正在进行一些集成测试,在集成测试之前将数据加载到远程测试数据库中。然而,这是大量的数据,所以我宁愿在所有集成测试之前只做一次。

我已经让@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总是空的,因为@BeforeClass需要从静态上下文中运行。我还尝试使用@ClassRule,如下所示:如何在多个测试类之间共享JUnit BeforeClass逻辑,但不做任何更改;

如何同时获得一组测试类的@BeforeClass/@AfterClass功能并在@BeforeClass/@AfterClass方法中拥有Autow的资源?让它也使用@Parameterize运行会更好。

共有1个答案

房唯
2023-03-14

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
}

您可以尝试这样做(而不是使用InitializingBean中的@BeforeClass use afterPropertiesSet-它是在调用ForeClass之前但在执行所有测试状态之前执行的)

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");
}
}

在任何情况下,这都是一些解决方法,因为测试类是在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);
}
}
 类似资料:
  • 问题内容: 我的WEB-INF目录下有一些XML文件: lyricsBaseApp-servlet.xml hibernate.xml dataSource.xml beans.xml servlet xml导入其他xml文件: 我希望我的junit4 类包含整个spring配置。使用默认文件名,我创建了一个文件。最后,我不知道该放在哪里… 我试过了: 要么 和其他一些想法,但都失败了。有人可以指

  • 问题内容: 在下面使用这种方法时,通过设置带有套件的jUnit。当每个Testclass中的所有@BeforeClass将在开始执行任何测试之前执行时,我们遇到了问题。(对于每个n个TestClass文件,@BeforeClass运行,然后在它们执行之后,它开始执行第一个MyTest.class文件@Test) 这将导致我们分配大量的资源和内存。我的想法是一定是错误的,每个@BeforeClass

  • 问题内容: 我有一堆JUnit测试用例(集成测试),它们在逻辑上分为不同的测试类。 我们能够为每个测试类加载一次Spring应用程序上下文,然后将其重新用于JUnit测试类中的所有测试用例 但是,我们只是想知道是否有一种方法可以对一堆JUnit测试类仅加载一次Spring应用程序上下文。 FWIW,我们使用Spring 3.0.5,JUnit 4.5并使用Maven构建项目。 问题答案: 是的,这

  • 嗨,我正试图让spring junit测试用例...我要求加载完整的应用程序上下文。但是,junit测试不会初始化完整的应用程序上下文。 因此,它应该扫描com.test包中的所有spring bean,并将它们加载到Junit TestCase的applicationcontext中。但从大豆的产量来看,它似乎没有做到这一点。

  • 问题内容: 当前,我所有的JUnit测试都从一个通用的基类扩展而来,该基类提供了带有和标记的方法 -真正要做的就是设置一堆静态资源/服务以供测试使用。 由于某些原因,这对我来说似乎很尴尬: 根据我的理解,JUnit4的部分要点是我们不再需要这种经典的测试继承。 当我将这些测试作为套件的一部分而不是单独运行(我们经常这样做)时,多次调用和,从而减慢了测试的速度-我们实际上应该只调用一次 我想做的是以

  • 我有一个通用代码库,需要用不同的实现和运行时配置进行测试。考虑使用多个DAO实现的服务。我有测试Dao接口的通用单元测试(需要Dao自动连接),我想从不同的项目中调用这些测试。 基本上我想要这样的东西。在共享的通用项目中,我的测试将有效。所以本质上,在共享项目中,我有我的测试,例如。 然后在实现Dao的其他项目中,我会: . 同样,有多个项目以不同的方式实现DAO层,我想分享通用测试。 如果我能将