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

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)

相同的代码对于相同类中的其他测试也可以正常工作,这些测试以相同的方式成功捕获了相同类型的对象的创建。

任何帮助表示赞赏!谢谢

goo*_*lie 5

在这里聚会晚了,但是我认为适当的解决方案仍然缺失。如您所知,您必须要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不必在阳光下准备每个课程即可进行测试。