Mockito.doReturn()。when()不起作用-单元测试继续调用原始方法

时间:2019-01-15 14:44:41

标签: java mockito

我正在为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 :(得分:4)

要真正使用间谍,对price(listOfProductsToPrice)的调用需要转到实例spyPricingSession上的间谍

List<PricingResult<?>> pricedProducts = spyPricingSession.price(listOfProductsToPrice);