运行 对任何测试只设置和拆卸一次 JUnit 运行
Run JUnit setup and teardown exactly once for any test(s) run
在每次 JUnit 测试之前,我 运行 需要设置一些东西。需要加载一些属性,需要建立数据库连接,需要启动单独的 J2SE 应用程序等。当每个测试完成后,可以终止数据库连接并关闭 J2SE 应用程序。
我可以通过在测试套件中使用@BeforeClass 和@AfterClass 注释来完成此操作,但这限制了我只能在套件内进行 运行 测试。如果我想 运行 套件外的单独测试,它不会 运行 套件设置和拆卸方法。同样,如果我想 运行 一个单独的测试方法(通过 IDE),它不会 运行 套件的设置和拆卸。
有没有一种方法可以设置 JUnit 测试,以便无论它们如何 运行,通过套件、测试用例或单独的方法,它们总是 运行设置方法 only 在 运行ning 之前执行一次,并且在每个测试执行后拆卸 only 一次?让所有测试用例都使用静态初始化程序扩展抽象 class 可以解决设置问题,但不能解决拆卸问题。
我能够使用两种不同的方法完成所需的工作。如果只有一种方法有效,我会更喜欢,但这会...
我有一个实现 testRunFinished:
的自定义 RunListener class
public class MyRunListener extends RunListener
{
@Override
public void testRunFinished(Result result) throws Exception
{
//Do whatever teardown needs to be done
}
}
然后我有一个自定义的 BlockJUnit4ClassRunner class 使用以下 运行() 方法:
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);
}
抽象测试用例class使用注解:
@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,那会很好,但与此同时,这是可行的。
在每次 JUnit 测试之前,我 运行 需要设置一些东西。需要加载一些属性,需要建立数据库连接,需要启动单独的 J2SE 应用程序等。当每个测试完成后,可以终止数据库连接并关闭 J2SE 应用程序。
我可以通过在测试套件中使用@BeforeClass 和@AfterClass 注释来完成此操作,但这限制了我只能在套件内进行 运行 测试。如果我想 运行 套件外的单独测试,它不会 运行 套件设置和拆卸方法。同样,如果我想 运行 一个单独的测试方法(通过 IDE),它不会 运行 套件的设置和拆卸。
有没有一种方法可以设置 JUnit 测试,以便无论它们如何 运行,通过套件、测试用例或单独的方法,它们总是 运行设置方法 only 在 运行ning 之前执行一次,并且在每个测试执行后拆卸 only 一次?让所有测试用例都使用静态初始化程序扩展抽象 class 可以解决设置问题,但不能解决拆卸问题。
我能够使用两种不同的方法完成所需的工作。如果只有一种方法有效,我会更喜欢,但这会...
我有一个实现 testRunFinished:
的自定义 RunListener classpublic class MyRunListener extends RunListener
{
@Override
public void testRunFinished(Result result) throws Exception
{
//Do whatever teardown needs to be done
}
}
然后我有一个自定义的 BlockJUnit4ClassRunner class 使用以下 运行() 方法:
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);
}
抽象测试用例class使用注解:
@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,那会很好,但与此同时,这是可行的。