我正在使用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执行某种“清理”吗?
我正在使用以下依赖项:
答案 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();
}
到基础测试课程。