2017-04-13 60 views
0

當我嘗試執行以下簡化的JUnit測試時,它會成功,但我收到錯誤消息:創建所有測試實例時不支持通知第一!Powermock:首先創建所有測試實例時不支持通知

@RunWith(PowerMockRunner.class) 
@PowerMockRunnerDelegate(BlockJUnit4ClassRunner.class) 
@PrepareForTest({ A.class }) 
public class TestA extends TestB { 
    @Test 
    public void test() throws Exception { 
     assertEquals(true, true); 
    } 
} 

public class TestB {} 
public class A {} 

當我除去@PowerMockRunnerDelegate(BlockJUnit4ClassRunner.class)extends TestB@PrepareForTest({ A.class }),所述信息消失。即使是一個模糊的@PrepareForTest({ })也會顯示錯誤消息。

我發現這個post,但它不是相同的問題,因爲我沒有使用擴展BlockJUnit4ClassRunner

我想了解爲什麼會出現此錯誤消息。

我正在使用最新版本的Powermock(1.6.6)和JUnit 4.12並使用java8運行測試。

回答

1

PowerMock擴展了jUnit事件消息並在測試生命週期中觸發了一些額外的事件。 PowerMockTestListener可用於偵聽所有jUnit和其他PowerMock事件。

此事件之一需要創建每個測試的實例。一個jUnit運行器通常會爲類中的每個測試方法創建一個新的測試類實例,但其中一些實例只能爲所有測試創建一個類實例。當使用@PowerMockRunnerDelegate時,委託運行者負責創建測試實例。

如果事件「測試開始」在沒有「測試創建」的情況下被觸發,那麼PowerMock檢測到所有測試實例都是在測試開始之前創建的,並且無法激發其內部事件並將此消息打印到system.err。所以,你有同樣的問題,因爲它已被描述在後。

PowerMock在當前時刻只有一個執行PowerMockTestListener - AnnotationEnabler。此實現用於與EasyMock和Mockito集成並支持註釋,如@TestSubject,@Mock等。因此,您在控制檯中看到此消息,這意味着這些功能無法正常工作。但對於Mockito的情況下,使用MockitoAnnotations.initMocks(this)可以更容易地解決這個問題。

非常有趣的是,如果你刪除'擴展TestB'消息消失。我會檢查這個案件並調查爲什麼發生。