我有很多基本上執行相同@BeforeClass
的單元測試文件。在任何junit測試運行之前執行一些代碼
他們啓動jetty web服務器,添加一些系統屬性。
所以我想知道,是否有可能在單元測試運行之前僅執行一次?
我有很多基本上執行相同@BeforeClass
的單元測試文件。在任何junit測試運行之前執行一些代碼
他們啓動jetty web服務器,添加一些系統屬性。
所以我想知道,是否有可能在單元測試運行之前僅執行一次?
您可以使用@RunWith註釋:
@RunWith(JettyRunner.class)
public class MyAwesomeTest {
@Test
//...
}
和實施新轉輪
public class JettyRunner extends BlockJUnit4ClassRunner {
private static boolean initialized = false;
public JettyRunner(Class<?> klass) throws InitializationError {
super(klass);
synchronized (JettyRunner.class) {
if (!initialized) {
System.out.println("Let's run jetty...");
initialized = true;
}
}
}
}
我不知道,如果是真正需要的synchronized塊,只是把它扔在良好的措施...
也許使用靜態初始化器會做什麼?雖然在運行單元測試時僅初始化一些字段並不是一個好主意,因爲某些測試可能會將字段驅動到非法狀態,從而妨礙其他測試的運行。
你是否從套件中運行測試類?在任何測試運行之前,套件類上的@BeforeClass
將運行一次。
除了@馬特的關於創建自己的亞軍(我認爲是最好的方法)的答案(見the answer here),我也c重新進行了額外的JUnit測試,驗證了我的所有測試都使用了我的Runner(以防我的開發人員遺忘):
PS:注意這取決於OpenPOJO。
@Test
public void ensureAllTestsUseEdgeRunner() {
for (PojoClass pojoClass : PojoClassFactory.getPojoClassesRecursively("your.base.package", null)) {
boolean hasTests = false;
for (PojoMethod pojoMethod : pojoClass.getPojoMethods()) {
if (hasTests = pojoMethod.getAnnotation(Test.class) != null) {
break;
}
if (hasTests = pojoMethod.getAnnotation(BeforeClass.class) != null) {
break;
}
if (hasTests = pojoMethod.getAnnotation(Before.class) != null) {
break;
}
if (hasTests = pojoMethod.getAnnotation(AfterClass.class) != null) {
break;
}
if (hasTests = pojoMethod.getAnnotation(After.class) != null) {
break;
}
}
if (hasTests) {
PojoClass superClass = pojoClass;
boolean hasRunWith = false;
while (superClass != null) {
// ensure it has the RunWith(EdgeJUnitRunner.class) annotation
RunWith runWithAnnotation = superClass.getAnnotation(RunWith.class);
if (runWithAnnotation != null && runWithAnnotation.value() == EdgeJUnitRunner.class) {
hasRunWith = true;
break;
}
superClass = superClass.getSuperClass();
}
if (!hasRunWith) {
throw new RuntimeException(pojoClass.getClazz().getName() + " should be annotated with @RunWith(EdgeRunner.class)");
}
}
}
}
我們有一個要求 - 測試應該在沒有任何套件的情況下運行。如果該@BeforeClass不會被執行 - 那麼沒有任何工作:) – skatkov