rad*_*dar 2 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();
}
});
}
Run Code Online (Sandbox Code Playgroud)
我用来尝试捕获对象创建的代码:
SomeObject mockSomeObject = mock(SomeObject.class);
PowerMockito.whenNew(SomeObject.class).withNoArguments().thenReturn(mockSomeObject);
Run Code Online (Sandbox Code Playgroud)
相同的代码对于相同类中的其他测试也可以正常工作,这些测试以相同的方式成功捕获了相同类型的对象的创建。
任何帮助表示赞赏!谢谢
在这里聚会晚了,但是我认为适当的解决方案仍然缺失。如您所知,您必须要PrepareForTest
执行要模拟的对象创建的类。不太明显的是实际在此处进行创建的类。该类是内部匿名Runnable
类。此类的名称在编译时生成,在单元测试中不容易确定。假设从片段中提取的类是com.example.SomeClass
您需要的语句,例如:
@PrepareForTest(com.example.SomeClass$4.class)
Run Code Online (Sandbox Code Playgroud)
但是更简单的方法是使用允许通配符的注释的其他形式:
@PrepareForTest("com.example.*")
Run Code Online (Sandbox Code Playgroud)
只需尝试使通配符匹配器尽可能紧密,以使PowerMock不必在阳光下准备每个课程即可进行测试。