java - Powermockito 预期的对象创建在线程中预期时不起作用

标签 java junit mockito powermock

我在一些单元测试中使用 PowerMockito,但遇到了问题。我正在尝试测试一种创建一系列线程并运行它们的方法。在每个线程内,创建一个我需要期望的对象,并返回我自己的模拟对象(它发出 http 请求等)。我在使用 PowerMockito.whenNew(...) 之前已经完成了此操作,并且它工作得很好,但这似乎不起作用 - PowerMockito 不在线程内工作吗?我还没有找到任何其他类似的问题或有关这种情况的文档。

一些示例代码可帮助您直观地了解:

for(Object object : objectList) {
    Thread t = new Thread(new Runnable() {
        public void run() {
            SomeObject objectImTryingToStub = new SomeObject();
        }
    });
}

我用来 try catch 该对象创建的代码:

SomeObject mockSomeObject = mock(SomeObject.class);
PowerMockito.whenNew(SomeObject.class).withNoArguments().thenReturn(mockSomeObject);

相同的代码在同一类中的其他测试中运行良好,成功地以相同的方式捕获了相同类型对象的创建。

感谢任何帮助!谢谢

最佳答案

这里的聚会迟到了,但我认为仍然缺少适当的解决方案。如您所知,您必须 PrepareForTest 执行您尝试模拟的对象创建的类。不太明显的是这里实际进行创建的类。该类是内部匿名 Runnable 类。该类的名称是在编译时生成的,在单元测试中不容易确定。假设提取片段的类是 com.example.SomeClass,您需要的语句可能类似于:

@PrepareForTest(com.example.SomeClass$4.class)

但更简单的方法是使用允许通配符的其他形式的注释:

@PrepareForTest("com.example.*")

只要尽量保持通配符匹配器尽可能紧密,这样 PowerMock 就不必准备每个类来运行测试。

关于java - Powermockito 预期的对象创建在线程中预期时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24960051/

相关文章:

java - 如何从 java 8 中的 LocalTime 中删除毫秒

maven - 如何使用 pom 分离 JUnit 测试和 Selenium 测试

java - JUnit 测试单独成功,但一起执行时失败并导致错误?

java - Mockito:使用回调方法模拟两个返回值

java - 如何在 Java 中模拟静态方法?

java - 查找异常类型

java - JTextPane 换行行为

java - 如何使用方法绘制脸部

java - GWT JUnit 测试 - 是否可以忽略同源策略

java - 如何使用Mockito测试Android MainActivity onCreate中的依赖