[英]Confusing execution order of JUnit methods
我通過擴展Suite
創建了一個自定義運行器:
public class MyRunner extends Suite {
public MyRunner(Class<?> klass, RunnerBuilder builder) throws InitializationError {
super(klass, builder);
}
@Override
public void run(RunNotifier notifier) {
notifier.addListener(new MyRunListener());
notifier.fireTestRunStarted(getDescription());
super.run(notifier);
}
}
正如在run
中看到的那樣,它注冊了一個MyRunListener
,如下所示:
class MyRunListener extends RunListener {
@Override
public void testRunStarted(Description description) {
System.err.println("1: run started");
}
@Override
public void testStarted(Description description) {
System.err.println("2: test started");
}
@Override
public void testFinished(Description description) {
System.err.println("3: test finished");
}
@Override
public void testRunFinished(Result result) {
System.err.println("4: run finished");
}
}
根據我希望調用這些方法的順序,我添加了1:
、 2:
、 3:
和4:
。
然后我創建了一個如下所示的測試套件:
@RunWith(MyRunner.class)
@Suite.SuiteClasses({ MyTest.class })
public class MyTestSuite {
}
以及以下測試:
public class MyTest {
@BeforeClass
public static void beforeClass() {
System.err.println("A: beforeClass");
}
@Before
public void before() {
System.err.println("B: before");
}
@Test
public void test() {
System.err.println("C: Running actual test...");
}
@After
public void after() {
System.err.println("D: after");
}
@AfterClass
public static void afterClass() {
System.err.println("E: afterClass");
}
}
同樣,output 按照我期望的順序標記。
這是我通過 IntelliJ 運行MyTestSuite
時得到的 output(作為 JUnit 運行配置):
2: test started
B: before
C: Running actual test...
D: after
3: test finished
E: afterClass
4: run finished
1: run started
A: beforeClass
為什么我會收到 output 訂單? 我的跑步者一定做錯了什么,但我剛剛根據 web 上的教程實現了它。 (使用 JUnit 4.12)
正如@DmitryB 在評論中所建議的那樣,它似乎是某種形式的 output 緩沖。 測試完成后,output 的各個部分以一種奇怪的方式縫合在一起。
我在每次打印輸出后添加了Thread.sleep(1000)
,這就是我在 IntelliJ 中運行它時的樣子:
目前的解決方法是使用 gradle 任務運行配置而不是 JUnit 之一。
在 Jetbrains 提交了這張票。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.