将junit侦听器添加到SpringJUnit4ClassRunner

isa*_*zan 3 java junit spring unit-testing

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

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

     ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢.

小智 8

您可以使用@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();     
    } 
}
Run Code Online (Sandbox Code Playgroud)

在你的测试中:

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

     ...
}
Run Code Online (Sandbox Code Playgroud)