我在Java 1.8类中实现了使用Spring Framework(版本5.0.5.5.Release)中的异步方法:
public class ClassToBeTested {
@Autowired
private MyComponent myComponent;
@Async
public void doStuff(List<MyClass> myObjects) {
CompletableFuture<MyResponseObject>[] futureList = new CompletableFuture[myObjects.size()];
int count = 0;
for (MyClass myObject : myObjects) {
futureList[count] = myComponent.doOtherStuff(myObject);
count++;
}
// Wait until all doOtherStuff() calls have been completed
CompletableFuture.allOf(futureList).join();
... other stuff ...
}
}
我正在尝试使用Junit和Mockito测试课程。我已经将其设置为如下,目的是嘲笑Dostuff()方法对组件的调用:
@MockBean
private MyComponent myComponentAsAMock;
@InjectMocks
@Autowired
private ClassToBeTested classToBeTested;
@Test
public void myTest() throws Exception {
// Create object to return when myComponent.doOtherStuff() is called.
CompletableFuture<MyResponseObject> completableFuture = new CompletableFuture<MyResponseObject>();
... populate an instance of MyResponseObject ...
completableFuture.complete(myResponseObject);
// Return object when myComponent.doOtherStuff() is called.
Mockito.when(
myComponentAsAMock.doOtherStuff(ArgumentMatchers.any(MyClass.class)))
.thenReturn(completableFuture);
// Test.
List<MyClass> myObjects = new ArrayList<MyClass>();
MyClass myObject = new MyClass();
myobjects.add(myObject);
classToBeTested.doStuff(myObjects);
}
当我在Eclipse中单独运行时,单位测试似乎是成功的,但是对整个项目进行Maven构建,但我注意到正在投掷NullPoInterExceptions:
[ThreadExecutor2] .a.i.SimpleAsyncUncaughtExceptionHandler : Unexpected error occurred invoking async method 'public void package.ClassToBeTested.doStuff(java.util.List)'.
java.lang.NullPointerException: null
at java.util.concurrent.CompletableFuture.andTree(CompletableFuture.java:1306) ~[na:1.8.0_131]
at java.util.concurrent.CompletableFuture.allOf(CompletableFuture.java:2225) ~[na:1.8.0_131]
at package.ClassToBeTested.doStuff(ClassToBeTested.java:75) ~[classes/:na]
在这条classtobetested.java的行上提出了错误:
CompletableFuture.allOf(completedFutureList).join();
it 看起来像像测试完成后在Maven构建输出中显示的异常消息(还有其他测试正在运行其输出,其输出发生在显示错误消息之前),所以我``我猜这与dostuff()的呼叫是异步的事实有关。
任何帮助将不胜感激。
解决方案是在暂停和检查中添加一个overito验证步骤,以确保模拟组件的方法称为适当的次数:
Mockito.verify(myComponentAsAMock, Mockito.timeout(1000).times(1)).doOtherStuff(ArgumentMatchers.any(MyClass.class));