我在一些单元测试中使用 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/