Как смоделировать универсальный параметр для модульного теста в Java? - PullRequest
0 голосов
/ 31 октября 2018

У меня есть подпись функции, которую я хотел бы посмеяться над внешней службой.

public <T> void save(T item, AnotherClass anotherClassObject);

С учетом сигнатуры этой функции и имени класса IGenericService как можно посмеяться над ней с помощью PowerMock? Или Мокито?

Для этого универсального я использую: Класс Theodore для T в T item. Например, я попытался использовать:

doNothing().when(iGenericServiceMock.save(any(Theodore.class),
                    any(AnotherClass.class));

IntelliJ проворачивает это:

save(T, AnotherClass) cannot be applied to 
(org.Hamcrest.Matcher<Theodore>, org.Hamcrest.Matcher<AnotherClass>)

И приводит следующую причину:

reason: No instance(s) of type variable T exist 
so that Matcher<T> conforms to AnotherClass

Во-первых, проблему следует решить, если аргумент обобщений обрабатывается правильно. Что можно сделать в таких ситуациях?

ОБНОВЛЕНИЕ: Как ETO поделился:

doNothing().when(mockedObject).methodToMock(argMatcher); 

постигла та же участь.

Ответы [ 3 ]

0 голосов
/ 31 октября 2018

Вы передаете неправильные параметры when. Это может немного сбивать с толку, но есть два разных использования метода when (на самом деле это два разных метода):

  1. when(mockedObject.methodYouWantToMock(expectedParameter, orYourMatcher)).thenReturn(objectToReturn);
    
  2. doReturn(objectToReturn).when(mockedObject).methodYouWantToMock(expectedParameter, orYourMatcher);
    

Примечание: обратите внимание на входные параметры метода when в обоих случаях .

В вашем конкретном случае вы могли бы сделать что-то вроде этого:

doReturn(null).when(iGenericServiceMock).save(any(Theodore.class), any(AnotherClass.class));

Это исправит проблемы с компиляцией. Однако тест не будет выполнен во время выполнения с org.mockito.exceptions.misusing.CannotStubVoidMethodWithReturnValue, потому что вы пытаетесь вернуть что-то из метода void (null не void). Что вы должны сделать, это:

doNothing().when(iGenericServiceMock).save(any(Theodore.class), any(AnotherClass.class));

Позже вы можете проверить взаимодействие с макетом, используя метод verify.

UPDATE:

Проверьте ваш импорт. Вы должны использовать org.mockito.Matchers.any вместо org.hamcrest.Matchers.any.

0 голосов
/ 31 октября 2018

Великолепные и быстрые ответы! Я наконец получил его, чтобы сгладить с помощью следующего кода:

doNothing().when(iGenericServiceMock).save(Mockito.any(), Mockito.any()); 

только когда я добавил Макито к любому методу, Интеллидж снова обрадовался этому.

0 голосов
/ 31 октября 2018

Попробуйте использовать Mockito's ArgumentMatcher. Также в when поместите только ссылку на макет:

doReturn(null).when(iGenericServiceMock).save(
    ArgumentMatchers.<Theodore>any(), ArgumentMatchers.any(AnotherClass.class));
...