在每次JUnit测试之前,我都需要设置某些东西。需要加载一些属性,需要建立数据库连接,需要启动单独的J2SE应用程序等。当每个测试完成后,数据库连接就会被终止,J2SE应用程序也会被关闭。
我可以通过在测试套件中使用@BeforeClass和@AfterClass注释来实现这一点,但这限制了我只能在套件内运行测试。如果我想在套件外运行单独测试,则不会运行套件设置和拆卸方法。同样,如果我想运行一个单独的测试方法(通过IDE),它将不会从套件中运行设置和拆卸。
有没有办法设置JUnit测试,这样无论它们如何运行,通过套件,测试用例或单个方法,它们总是运行设置方法 在执行任何操作之前,在每次测试执行后,只有一次拆除 一次?让所有测试用例扩展一个带有静态初始化程序的抽象类可以解决设置问题,但不能解决。
答案 0 :(得分:1)
我能够使用两种不同的方法完成我需要的工作。如果只有一种方法可以工作,我更喜欢,但这样做......
我有一个实现testRunFinished的自定义RunListener类:
public class MyRunListener extends RunListener
{
@Override
public void testRunFinished(Result result) throws Exception
{
//Do whatever teardown needs to be done
}
}
然后我有一个带有以下run()方法的自定义BlockJUnit4ClassRunner类:
private static boolean listenerAdded = false;
@Override
public void run(RunNotifier notifier)
{
//listenerAdded required or else the listener will be added once for every test case, and testRunFinished will be run multiple times
if(!listenerAdded)
{
listenerAdded = true;
notifier.addListener(new MyRunListener());
}
super.run(notifier);
}
抽象测试用例类使用注释:
@RunWith(MyRunner.class)
我希望我也可以在MyRunListener中实现testRunStarted,但它没有用。显然在MyRunner中添加了这样的监听器,监听器不会被添加到之后运行testRunStarted方法,因此它不会被执行。如原始问题所述,解决方法是在AbstractTestCase中使用静态初始化器:
@RunWith(MyRunner.class)
public class AbstractTestCase
{
private static boolean setupDone = false;
static
{
if(!setupDone)
{
setupDone = true;
//Do whatever setup needs to be done
}
}
...
如果有人知道添加MyRunListener的方法,那将允许使用testRunStarted,这会很好,但在此期间这是有效的。