Mockito.doReturn (). When () не работает - модульный тест продолжает вызывать оригинальный метод - PullRequest
0 голосов
/ 15 января 2019

Я пишу модульный тест для SOAP API, в котором мне нужно смоделировать ответ определенного метода, который, однако, вызывается постоянно.

(соответствующий) код моего модульного теста следующий:

import org.mockito.Matchers;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;


public class PricingSessionTest{

    @Test
    public void testPricingOfStrategyWithCorrectFormat() throws Exception {

        //[...other code...]
        PricingSessionImpl pricingSession = new PricingSessionImpl(this.session);
        PricingSessionImpl spyPricingSession = Mockito.spy(pricingSession);
        Mockito.doReturn(myResult)
               .when(spyPricingSession)
               .send(
                   Mockito.any(MxML.class),
                   Matchers.eq(ACTION_PRICE),
                   Matchers.eq(TimeoutDuration),
                   Matchers.eq(TimeoutUnit)
                );
        List<PricingResult<?>> pricedProducts = pricingSession.price(listOfProductsToPrice);        
    }

Внутри метода .price() объекта-шпиона pricingSession (тип PricingSessionImpl) есть вызов следующего метода:

protected List<MxDocument> send(MxML mxml, String action, long timeout, TimeUnit timeoutUnit) throws RequestException, RequestTimeoutException 

Реализация метода находится в родительском классе public abstract class AbstractPricingSession (но сам метод не abstract), вы можете найти иерархию ниже:

enter image description here

Когда я отлаживаю этот модульный тест, в какой-то момент я сталкиваюсь с вызовом метода, который хочу смоделировать:

List<MxDocument> documents = send(mxml, ACTION_PRICE, getTimeoutDuration(), getTimeoutUnit());

Здесь я бы ожидал, что мой Mockito вернет мне myResult, поскольку вызов метода send() в классе PricingSessionImpl выполняется с параметром типа MxML, а затем с одним String, один long и один TimeUnit, которые именно то, что я передаю на .when().

Однако метод продолжает вызываться.

Может кто-нибудь указать мне правильное направление для устранения этой проблемы? Обратите внимание, что я проверил несколько вопросов / ответов по этому вопросу, уже присутствующим в Интернете, но пока не нашел ничего полезного для моего конкретного случая.
Если вам нужно больше увидеть в коде, не стесняйтесь спрашивать.

1 Ответ

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

Чтобы шпион действительно использовался, вызов price(listOfProductsToPrice) должен идти к шпионскому инстансу spyPricingSession

List<PricingResult<?>> pricedProducts = spyPricingSession.price(listOfProductsToPrice);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...