gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:02:53 25 4
gpt4 key购买 nike

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

假设我们要测试一个类:

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

还有一个使用 PowerMock 测试私有(private)方法的测试类:

@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

最佳答案

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

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();
}

到你的基础测试类。

关于java - PowerMock 影响其他测试类中的测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33740422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com