我的代码库与此相似,其中基于输入参数,我使用lambda表达式创建对象。(我使用lambda表达式并行创建对象的原因是因为对象创建操作是昂贵的)。
private List<Future<MyObj1>> myObj1FutureList = new ArrayList<>();
for (String key : keys) {
Future<MyObj1> myObj1Future = executorService.submit(() -> new MyObj1(AnyObject, Arrays.asList(key),"AnyString",AnyObject,null,AnyObject));
myObj1FutureList.add(myObj1Future);
}
我正在为此编写单位测试用例。我必须嘲笑执行者服务以及lambda的表达。我正在使用类似的测试用例
Future<MyObj1> myObj1Future1 = mock(Future.class);
MyObj1 myObj1 = mock(MyObj1.class);
when(myObj1Future1.get()).thenReturn(myObj1);
PowerMockito.whenNew(MyObj1.class).withArguments(eq(obj1), eq(Arrays.asList(myObj1)), anyString(), any(),any(), any()).thenReturn(myObj1);
when(executorService.submit(() -> myObj1)).thenReturn(myObj1Future1);
,但我观察到,模拟对象的价值呈空。我在这里错过了什么吗?请建议。
只是为了添加更多信息,MyOBJ1在构造函数中有6个参数。注意:尽管PowerMockito的使用成本很高,但我只看到此可能的选项。请建议其他任何可能的选择。
您正在过度复杂您的测试。
这就是应该的样子:
MyObj1 result1 = new MyObj1(...); // Use whatever parameters you want.
MyObj1 result2 = new MyObj1(...); // Use whatever parameters you want.
Future<MyObj1> future1 = CompletableFuture.completedFuture(result1);
Future<MyObj1> future2 = CompletableFuture.completedFuture(result2);
when(executorService.submit(Mockito.<Callable<MyObj1>>any()))
.thenReturn(future1, future2);
从拇指中排除:
- 不要模仿您的pojos或类似pojo的结构(
MyObj1
和Future
)。 - 使用更复杂的对象的最基本的类似Pojo的项目。对于
Future
,它是CompletableFuture.completedFuture(obj)
。