Mock ExecutorService и лямбда-выражение для модульного теста в Java - PullRequest
0 голосов
/ 15 февраля 2019

Моя база кода похожа на эту, где на основе входных параметров я создаю объект с помощью лямбда-выражения.(Причина, по которой я использую лямбда-выражение для параллельного создания объекта, заключается в том, что операция создания объекта является дорогостоящей).

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);
            }

Я пишу тестовые случаи для этого.где я должен издеваться над службой исполнения, а также лямбда-выражением.Я использую похожие тестовые случаи

    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 стоит дорого, я вижу только эту возможную опцию.Пожалуйста, предложите любой другой возможный вариант.

1 Ответ

0 голосов
/ 15 февраля 2019

Вы чрезмерно усложняете свой тест.

Вот как это должно выглядеть:

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-like конструкциями (MyObj1 и Future).
  • Используйте самые простые pojo-подобные элементы вашего более сложного объекта.В случае Future это CompletableFuture.completedFuture(obj).
...