用java中的单元测试模拟ExecutorService和Lambda表达式

问题描述 投票:0回答:1

我的代码库与此类似,基于输入参数,我使用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的使用成本很高,但我只看到了这种可能的选择。请建议任何其他可能的选择。

java unit-testing mockito executorservice powermockito
1个回答
0
投票

你的考试过于复杂化了。

它应该是这样的:

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的结构(MyObj1Future)。
  • 使用更复杂对象中最基本的类似pojo的项。在Future的情况下,它是CompletableFuture.completedFuture(obj)
© www.soinside.com 2019 - 2024. All rights reserved.