Использование Mockito doReturn всегда возвращает ноль - PullRequest
0 голосов
/ 23 апреля 2019

Я использую Mockito для моего тестового класса:

@RunWith(SpringRunner.class)
@Import({MyTestContextConfiguration.class})
public class MyWorkerTest extends BaseWorkerTest {

    @Spy
    protected static MyWorkerImpl externalTaskTopicServiceImpl;

    @Before
    @SneakyThrows
    public void setUp() {
        final Similarity similarity0 = Similarity.builder()
        .automatic(Boolean.TRUE)
        .score(0.555D)
        .build();

        final MyRequest mpr = MyRequest.builder()
        .reference(prod)
        .build();

        Mockito.doReturn(similarity0).when(externalTaskTopicServiceImpl).invokeMyService(mpr);
        //Mockito.when(ReflectionTestUtils.invokeMethod(externalTaskTopicServiceImpl, "invokeMyService", mpr)).thenReturn(similarity0);

    }

    @SneakyThrows
    @Test
    public void myTest() {
        ...
        externalTaskTopicServiceImpl.handle(externalTaskService, externalTask);
    }
}

MyRequest и Similarity - простые POJO, которые ObjectMapper обрабатывает как JSON.

Рабочий класс:

@Service
@Slf4j
public class MyWorkerImpl extends WorkerBase {
    @Override
    public void handle() {
        ...
        final MyRequest mpr = MyRequest.builder().reference(product).build();
        invokeMatchProductsService(mpr);
    }

    protected Similarity invokeMyService(final MyRequest req) throws MyServiceException {
        return httpService.matchPopResult(req);
    }
}

invokeMatchProductsService всегда возвращает null, когда я использую обозначение Mockito.doReturn(). Когда я использую нотацию Mockito.when(), возвращается объект сходства, но в конце тестовый пример завершается с:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
Similarity cannot be returned by toString()
toString() should return String
***
If you're unsure why you're getting above error read on.
Due to the nature of the syntax above problem might occur because:
1. This exception *might* occur in wrongly written multi-threaded tests.
   Please refer to Mockito FAQ on limitations of concurrency testing.
2. A spy is stubbed using when(spy.foo()).then() syntax. It is safer to stub spies - 
   - with doReturn|Throw() family of methods. More in javadocs for Mockito.spy() method.

Кто-нибудь может мне сказать, почему я всегда получаю нулевое значение при использовании doReturn (), как это предлагается, когда шпион заглушен?

1 Ответ

0 голосов
/ 24 апреля 2019

Если вы знаете, как это сделать правильно, это совсем не сложно! ;-)

Вместо того, чтобы заглушки таким образом:

Mockito.doReturn(similarity0).when(externalTaskTopicServiceImpl).invokeMyService(mpr);

Вы должны использовать Matchers или, точнее, ArgumentMatchers:

Mockito.doReturn(similarity0).when((MyWorkerImpl)externalTaskTopicServiceImpl).invokeMyService(ArgumentMatchers.any(MyRequest.class));

Очевидно, что неправильная заглушка приводит к нулю, потому что при шпионаже externalTaskTopicServiceImpl mpr , определенный локально только для / в тестовом примере, никогда не будет использоваться во время выполнения программы. Это позволяет избежать нулевого значения в invokeMyService().

Что касается org.mockito.exceptions.misusing.WrongTypeOfReturnValue, то это была только моя ошибка: Я разработал метод в классе spied для возврата ConcurrentHashMap<String, Object>, но в тестовом примере я возвратил объект ответа.

...