Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PowerMock影响其他测试类中的测试_Java_Junit_Mockito_Powermock_Powermockito - Fatal编程技术网

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

Java PowerMock影响其他测试类中的测试,java,junit,mockito,powermock,powermockito,Java,Junit,Mockito,Powermock,Powermockito,我正在使用PowerMock测试中断异常情况下的错误处理。不幸的是,这些测试有时似乎对其他测试类有一些副作用:我在一个测试类中配置的模拟在另一个测试类中似乎仍然有效。我把下面的例子精简到基本行,只是为了产生副作用 假设我们有一个类要测试: public class SomeClass { private void someMethod(Future<Document> future) { try { future.get(); } catch (Exc

我正在使用PowerMock测试
中断异常情况下的错误处理。不幸的是,这些测试有时似乎对其他测试类有一些副作用:我在一个测试类中配置的模拟在另一个测试类中似乎仍然有效。我把下面的例子精简到基本行,只是为了产生副作用

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

public class SomeClass {
  private void someMethod(Future<Document> future) {
    try {
      future.get();
    } catch (Exception e) {
      Thread.currentThread().interrupt();
    }
  }
}
我立即得到以下异常:

java.lang.InterruptedException: sleep interrupted
  at java.lang.Thread.sleep(Native Method)
  at de.mocktest.SimpleTest.shouldSleep(SimpleTest.java:9)
如果我再次在第一节课中删除mock,一切都会按预期进行

直到现在,我一直认为不同的测试类不应该相互影响。然而,在这个例子中,情况似乎是这样。这是我不知道的PowerMock的一些特性吗?如果是这样的话,有没有办法防止这种情况发生

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

我正在使用以下依赖项:

  • JUnit 4.12
  • 莫基托1.10.19
  • PowerMock 1.6.3

您似乎是对的,因为第一个测试影响到第二个测试,如果它们是套件的一部分。看看,如果你在睡眠前调用中断,如果中断状态没有被清除,你会得到一个异常。中断状态


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

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

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 8上重现这一点。您使用的是什么版本的Java?测试运行的顺序是什么(这真的不重要)?我使用的是Java1.8.0_60,这似乎只有在我运行PowerMock测试时才会发生。我也在使用maven来运行测试,但实际上我不知道这是否重要。你是对的,如果我将
test1
放入它自己的类中,这也会产生相同的行为。
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();
}