PowerMock影响其他测试类中的测试

时间:2015-11-16 16:46:11

标签: java junit mockito powermock powermockito

我正在使用PowerMock来测试InterruptedException时的错误处理。不幸的是,这些测试有时似乎对其他测试类有一些副作用:我在一个测试类中配置的模拟似乎在另一个测试类中仍然存在。我将以下示例剥离到基本行,以产生副作用。

让我们假设我们有一个要测试的类:

public class SomeClass {
  private void someMethod(Future<Document> future) {
    try {
      future.get();
    } catch (Exception e) {
      Thread.currentThread().interrupt();
    }
  }
}

使用PowerMock测试私有方法的一个测试类:

@RunWith(PowerMockRunner.class)
public class DispatcherTest {

  @Test
  public void simpleTest() throws Exception {
    Future<Object> futureMock = PowerMockito.mock(Future.class);
    PowerMockito.when(futureMock.get()).thenThrow(new InterruptedException());
    SomeClass dispatcher = PowerMockito.mock(SomeClass.class);
    Whitebox.invokeMethod(dispatcher, "someMethod", futureMock);
  }
}

当我现在创建另一个测试类(在第一个测试类之后执行)时,像这样:

public class SimpleTest {
  @Test
  public void simpleTest() throws InterruptedException {
    Thread.sleep(100);
  }
}

我立即得到以下例外:

java.lang.InterruptedException: sleep interrupted
  at java.lang.Thread.sleep(Native Method)
  at de.mocktest.SimpleTest.shouldSleep(SimpleTest.java:9)

如果我再次删除第一堂课中的模拟,一切都按预期工作。

到目前为止,我认为不同的测试类不应该相互影响。然而,在这个例子中,它似乎就是这种情况。这是PowerMock的一些功能我只是不知道吗?如果是这样,有什么办法可以阻止它吗?

Thread.currentThread().interrupt()可能阻止JUnit / PowerMock执行某种“清理”吗?

我正在使用以下依赖项:

  • JUnit 4.12
  • Mockito 1.10.19
  • PowerMock 1.6.3

2 个答案:

答案 0 :(得分:2)

如果它们是套件的一部分,那么第一个测试影响第二个测试似乎是正确的。查看this question,如果在睡眠前调用中断,如果尚未清除中断状态,则可以获得异常。中断状态is cleared (and interrupt exception thrown) on a number of method calls

如果这些是单元测试,您想要模拟对Thread.currentThread().interrupt()的调用。实际上,调用中断会破坏“单元测试”的“单元”部分

答案 1 :(得分:2)

您正在设置导致睡眠中断的中断标志。这与模拟没有关系,因为这个简单的例子显示了相同的行为:

public class SimpleTest {
    @Test
    public void test1() {
        Thread.currentThread().interrupt();
    }
    @Test
    public void test2() throws InterruptedException {
        Thread.sleep(100);
    }
}

如果您的测试使用中断,您可能需要添加:

@Before
public void before() {
    // clear the interrupted flag
    Thread.interrupted();
}

到基础测试课程。