Powermock:首先创建所有测试实例时,不支持通知

时间:2017-04-13 13:00:28

标签: junit junit4 powermock powermockito junit-runner

当我尝试执行以下简化的JUnit测试时,它成功但我收到一条错误消息:首先创建所有测试实例时不支持通知!

@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 })时,消息会消失。即使是emtpy @PrepareForTest({ })也会显示错误消息。

我发现了post,但这不是同一个问题,因为我没有使用扩展BlockJUnit4ClassRunner

我试图理解为什么会出现此错误消息。

我正在使用最新版本的Powermock(1.6.6)和JUnit 4.12并使用java8运行测试。

1 个答案:

答案 0 :(得分:2)

PowerMock在测试生命周期中扩展了jUnit事件消息并触发了一些其他事件。 PowerMockTestListener可用于监听所有jUnit和其他PowerMock事件。

此事件之一要求创建每个测试的实例。 jUnit运行器通常为类中的每个测试方法创建一个新的测试类实例,但是其中一些只能为所有测试创建一个类实例。当使用@PowerMockRunnerDelegate时,委托的运行者负责创建测试实例。

如果在没有“test created”的情况下触发事件“test start”,则PowerMock会在测试开始之前检测到所有测试实例都已创建,并且无法触发其内部事件,并且此消息将打印到system.err。因此,您遇到与帖子中描述的问题相同的问题。

PowerMock目前只有一个实现PowerMockTestListener - AnnotationEnabler。此实现用于与EasyMock和Mockito集成,并支持@TestSubject@Mock等注释。因此,您在控制台中看到此消息表示这些功能无法正常工作。但对于Mockito案例,可以使用MockitoAnnotations.initMocks(this)更容易解决。

非常有趣的是,如果你删除'extends TestB',消息就会消失。我会检查这个案子并调查它为什么会发生。