2011-10-19 219 views

回答

8

您可以使用@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塊,只是把它扔在良好的措施...

1

也許使用靜態初始化器會做什麼?雖然在運行單元測試時僅初始化一些字段並不是一個好主意,因爲某些測試可能會將字段驅動到非法狀態,從而妨礙其他測試的運行。

0

你是否從套件中運行測試類?在任何測試運行之前,套件類上的@BeforeClass將運行一次。

+0

我們有一個要求 - 測試應該在沒有任何套件的情況下運行。如果該@BeforeClass不會被執行 - 那麼沒有任何工作:) – skatkov

1

除了@馬特的關於創建自己的亞軍(我認爲是最好的方法)的答案(見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)"); 
      } 
     } 
    } 
} 
相關問題