2017-04-13 56 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'消息消失。我会检查这个案件并调查为什么发生。