【发布时间】:2019-02-15 14:12:29
【问题描述】:
我的代码库与此类似,基于输入参数,我使用 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);
}
我正在为此编写单元测试用例。我必须在其中模拟 executor 服务以及 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 的使用成本很高,但我只看到了这个可能的选项。 请提出任何其他可能的选择。
【问题讨论】:
-
最好正确格式化您发布的代码以使其更易于阅读和理解。
-
我的坏。由于隐私问题而更改名称时,我忘记重新格式化。
-
模拟
Future和MyObj1是不是有点过头了?Future的任何实现本身都是一个非常简单的类,它不依赖任何昂贵或外部的东西。如果是 POJO,MyObj1也一样。 -
MyObj1 不是 POJO。它有一些复杂的对象。对于某些对象,它对依赖图进行服务调用并获取数据。所以,在单元测试中,我也必须模拟它。
标签: java unit-testing mockito executorservice powermockito