当前位置: 首页 > 知识库问答 >
问题:

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

锺星腾
2023-03-14

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

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

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)

如果我在第一节课中再次删除mock,一切都会按预期进行。

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

无法执行线程。currentThread()。中断()可能会阻止JUnit/PowerMock执行某种“清理”?

我正在使用以下依赖项:

  • JUnit 4.12

共有2个答案

长孙永思
2023-03-14

如果第一个测试是套件的一部分,那么第一个测试会影响第二个测试,因此您似乎是正确的。看看这个问题,如果在睡眠前调用中断,如果中断状态尚未清除,则会出现异常。在许多方法调用上,中断状态被清除(并引发中断异常)。

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

狄心水
2023-03-14

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

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

到您的基本测试类。

 类似资料:
  • 实际上,它的测试如果eat方法对宠物有效,但我也需要检查feedPet方法对玩家也有效。 任何想法或建议都非常感谢。

  • 需要一些非常具体的包装器和例程。

  • 除了个别的测试驱动和行为驱动框架之外,还有一些通用的框架和辅助函数类库,对任何的测试方法都很有用。 工具地址 Selenium 是一个浏览器自动化工具 integrated with PHPUnit Mockery 是一个可以跟 PHPUnit 或者 PHPSpec 整合的 Mock 对象框架 Prophecy 是个有自己的想法,且非常强大灵活的 PHP 对象 mocking 框架。它整合了 PH

  • 我想现在,如果有可能模仿一个类一样 我们的业务逻辑在代码中的某个地方用< code>new myClass()创建了这个对象,因此我不能访问创建的对象来模拟这些方法。有没有办法替换整个类或者覆盖那些方法。我正在使用mockito,我只找到了这样做的例子 我们不能使用 PowerMock,因为它与我们的测试环境不兼容。 欢迎任何建议。

  • 问题内容: 我有一个仅在设置位标志时才运行的测试文件。我遵循了golang的测试文档中的一个简单示例: 如果我运行,它将按预期运行。但是,当我运行时,所有其他包测试均失败: 我希望能够运行所有测试,而不必担心在每个测试文件中解析此标志。有没有办法做到我所缺少的? 问题答案: 运行时,它会以相同的参数 将 每个程序包 作为单独的可执行文件 运行测试。因此,如果要向每个程序包传递一个标志,则每个程序包