我设置了一个测试类,而不是使用@Before
我想要一个在所有测试前只执行一次的设置方法。 Junit 4.8有可能吗?Junit - 运行设置方法一次
回答
虽然我@assylias同意使用@BeforeClass
是一个典型的解决方案并不总是方便。用@BeforeClass
注释的方法必须是静态的。一些需要测试用例的测试非常不方便。例如,基于Spring的测试使用@Autowired
来处理在spring上下文中定义的服务。
在这种情况下,我个人使用标注有@Before
注释定期setUp()
方法和管理我的自定义boolean
标志:
private static boolean setUpIsDone = false;
.....
public void setUp() {
if (setUpIsDone) {
return;
}
// do the setup
setUpIsDone = true;
}
setUpIsDone变量应该是静态的,以及您想要在setUp()中实例化的每个@Test方法中使用的其他对象。 –
添加到肯尼卡森的评论为什么它必须是静态的。它必须是静态的,因为JUnit为每个@Test方法实例化一个新的测试类实例。如果它不是静态的,那么实例变量将被重置为默认值(假)。有关详细信息,请参阅:http://martinfowler.com/bliki/JunitNewInstance.html –
这适用于除''setUp()'方法在超类中的情况 - 已发布[answer](http:// stackoverflow .com/questions/12087959#31117171)试图解决这个问题。 –
您可以使用the BeforeClass
annotation:
@BeforeClass
public static void setUpClass() {
//executed only once, before the first test
}
当setUp()
是在实际测试的超类,公认的答案可以作如下修改:
public abstract class AbstractTestBase {
private static Class<? extends AbstractTestBase> testClass;
.....
public void setUp() {
if (this.getClass().equals(testClass)) {
return;
}
// do the setup - once per concrete test class
.....
testClass = this.getClass();
}
}
这应该适用于一个单一的非静态设置()方法,但我不误入是无法生产的拆卸()等效一个复杂的反思世界......奖金指向任何人谁可以!
编辑: 我才发现这是在调试类是每次测试之前实例化了。 我猜@BeforeClass注解是最好的。
你也可以在构造函数上设置,测试类是毕竟是一个类。 我不确定这是否是一种不好的做法,因为几乎所有其他方法都被注释了,但它起作用。你可以创建一个这样的构造:
public UT() {
// initialize once here
}
@Test
// Some test here...
的构造函数将在测试之前,因为它们不是静态的调用。
的JUnit 5现在有一个@BeforeAll注释:
表示该注释的方法应之前执行的所有@Test 方法在当前类或类层次;类似JUnit 4的@BeforeClass。这些方法必须是静态的。
JUnit 5的生命周期注释似乎终于得到它了!你能猜到这看也不看注解可用(例如@BeforeEach @AfterAll)
'@ BeforeClass'有同样的问题,它需要是'static'。 IMO @ AlexR的解决方案更好。 – zengr
@zengr倾向于同意你的观点:正如我对AlexR所说的,他的解决方案要求所有测试类都从CommonTest类继承,如果它只运行一次。但这很简单,恕我直言,恕我直言,你可能不应该使用一种“花哨”的框架提供的解决方案,当一种简单的机制可以从语言中获得。除非当然有充分的理由。此外,使用像他这样的简单的东西,用一个好的“做它所说的锡”类型名称,有助于提高可读性。 –
话虽如此,恕我直言,似乎有更多的理由有一个“AfterAll”注释:这将是非常困难和设计一个机制来检测何时完成所有测试。相反,当然,纯粹主义者可能会说你不应该做“最后的清理”,即每个“tearDown”应该使所有资源保持原始状态......并且他们可能是对的! –
尝试这种解决方案: https://stackoverflow.com/a/46274919/907576:
与@BeforeAllMethods
/@AfterAllMethods
注释,你可以在一个实例方面,在执行中的测试类中的任何方法所有注入值都可用。
我肮脏的解决方案是:
public class TestCaseExtended extends TestCase {
private boolean isInitialized = false;
private int serId;
@Override
public void setUp() throws Exception {
super.setUp();
if(!isInitialized) {
loadSaveNewSerId();
emptyTestResultsDirectory();
isInitialized = true;
}
}
...
}
我用它作为基地基地,我所有的测试用例。
public class TestCaseExtended extends TestCase private static boolean isInitialized = false; 私有静态TestCaseExtended caseExtended; private int serId; @Override public void setUp()throws Exception { super.setUp();如果(!isInitialized){ caseExtended = new TestCaseExtended(); caseExtended.loadSaveNewSerId(); caseExtended.emptyTestResultsDirectory(); isInitialized = true; } } –
- 1. 设置方法运行一段时间?
- 2. 执行设置()一次解决方法造成TestSuit失败
- 3. 如何设置junit以与aspectJ运行
- 4. 仅运行测试设置一次
- 5. 传递参数的Junit设置方法
- 6. 运行Android的测试设置()方法被调用多次
- 7. 如何设置运行方法的次数? (cocos2d iPhone)
- 8. Junit - java.lang.Exception:没有可运行的方法
- 9. 运行Junit @Test方法时NoSuchMethodError
- 10. Junit的@试验方法,在运行时
- 11. 运行JUNIT方法时发生java.lang.ExceptionInInitializerError
- 12. 为什么junit运行注入方法?
- 13. 设置移动JUnit测试在JUnit中运行
- 14. PHP方法只能运行一次[SQL]
- 15. 在Angularjs中只运行一次方法
- 16. in_array方法只运行一次?
- 17. 运行liferay门户的设置方法
- 18. symfony3:密码设置运行此方法
- 19. 方法运行3次
- 20. Ant + Junit可以在第一次运行时再也不会再次运行
- 21. JUnit的设置命令行
- 22. 只需要运行一次location.reload方法一次
- 23. 如何使用junit从单一方法运行differents测试
- 24. 防止运行两次junit测试
- 25. 运行测试用例多次与不同@BeforeClass设置JUnit 4中
- 26. 如何在用户设置的时间运行一个方法?
- 27. 无法多次运行方法
- 28. VBScript运行/执行设置环境一次并重复使用
- 29. 在短时间内运行一次1000次的方法
- 30. 我的方法运行两次,它只被调用一次
看看RunListener:http://stackoverflow.com/a/14773170/548473 – GKislin