【问题标题】:Add a junit listener to a SpringJUnit4ClassRunner将 junit 侦听器添加到 SpringJUnit4ClassRunner
【发布时间】:2023-03-27 14:57:01
【问题描述】:

我有一个使用 SpringJUnit4ClassRunner 运行的单元测试,如下所示:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:aConfig.xml")
public class TestService
{
     @Resource
     EmbeddedMysqlDatabase mysqlDB;

     ...
}

我有一个在单元测试中使用的嵌入式数据库,我想在所有测试运行后关闭它。我知道在单元测试中嵌入数据库不是通常/好的做法,但在这种特殊情况下,这非常有用。

@AfterClass 不是一个选项,因为它必须是静态的,并且我的数据库实例是由 spring 注入的。不能注入静态成员。

我怎样才能通过监听器或任何其他方式做到这一点?

谢谢。

【问题讨论】:

  • 我认为侦听器不是一个好的选择,因为在构建工具(Gradle、Maven、Ant)和 IDE(IntelliJ、Eclipse、 ETC。)。在测试代​​码时,使用嵌入式数据库也为您提供了很多不错的选择(前提是您在嵌入式和运行时环境中使用相同的数据库)。
  • 谢谢。那么对于清理数据库实例,您有什么建议?
  • 既然是嵌入式数据库,下次创建时Spring Context被销毁或覆盖不就自动清除了吗?您想在嵌入式模式下使用哪个数据库?
  • 哦,你的意思是使用像 detroy-method 这样的东西吗?
  • 谢谢。我设法使用了 DB bean 的销毁方法,并且效果很好。

标签: java spring unit-testing junit


【解决方案1】:

您可以使用@TestExecutionListeners。 像这样的:

public class ShutdownExecutionListener extends AbstractTestExecutionListener {
    @Override 
    public void beforeTestClass(TestContext testContext) throwsException {
    }      
    @Override 
    public void afterTestClass(TestContext testContext) throws Exception{
        EmbeddedMysqlDatabase mysqlDB= 
            (EmbeddedMysqlDatabase)testContext.getApplicationContext().getBean(mysqlDB);
        mysqlDB.shutdown();     
    } 
}

在你的测试中:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:aConfig.xml")
@TestExecutionListeners(listeners = ShutdownExecutionListener.class)
public class TestService
{
     @Resource
     EmbeddedMysqlDatabase mysqlDB;

     ...
}

【讨论】:

  • Antonio,这与使用 BeforeClass / AfterClass 注释有何不同?
  • R4J:我想不同之处在于它有 testContext 允许访问与静态的@AfterClass不同的bean。在我的特定用例中,尽管 IMO 销毁方法技术更清洁。
【解决方案2】:

效果很好,但不要忘记设置“mergeMode”

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:aConfig.xml")
@TestExecutionListeners(listeners = {ShutdownExecutionListener.class}, 
                        mergeMode = MergeMode.MERGE_WITH_DEFAULTS)
public class TestService
{
    @Resource
    EmbeddedMysqlDatabase mysqlDB;
    ...
}

【讨论】:

    猜你喜欢
    • 2013-02-17
    • 2011-09-28
    • 1970-01-01
    • 2022-10-20
    • 2016-08-21
    • 1970-01-01
    • 2011-08-16
    • 2013-01-27
    • 2013-03-09
    相关资源
    最近更新 更多