将 junit 侦听器添加到 SpringJUnit4ClassRunner

Add a junit listener to a SpringJUnit4ClassRunner

我有一个单元测试 运行 与 SpringJUnit4ClassRunner 如下:

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

     ...
}

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

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

我如何通过侦听器或任何其他方式做到这一点?

谢谢。

您可以使用@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;

     ...
}

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

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