【问题标题】:Working of Mockito's verify and argument captorMockito 的验证和参数捕获器的工作
【发布时间】:2017-07-04 12:37:45
【问题描述】:

我正在尝试测试以下方法

public void saveToMultipleSources(MyObject myObject)
{
    if (myObject.isOfSomeType()) {
        firstDAO.saveObject(myObject);
        myObject.setContent(null);
    }
    secondDAO.saveObject(myObject);
}

我写的测试是

@Test
public void testSaveFeature()
{
    //initialize all objects
    obj.saveToMultipleSources(myObject); //myObject has a valid content.
    Mockito.verify(firstDAO).saveObject(myObject); 
    myObject.setContent(null);
    Mockito.verify(secondDAO).saveObject(myObject);
}

但在运行时,我收到错误,即 firstDAO 的验证语句的预期参数和实际参数不同。预期是一个具有有效内容的对象,但调用的实际参数的内容设置为空。我也用 ArgumentCaptor 尝试了完全相同的方法,但得到了相同的结果。

有人能解释一下为什么 Mockito 会这样吗?我尝试记录整个对象,并且可以看到在调用 firstDAO 之前设置的有效内容。

另外,我该如何进行测试?

【问题讨论】:

    标签: java unit-testing testing mockito


    【解决方案1】:
    //initialize all objects
    obj.saveToMultipleSources(myObject); //myObject has a valid content.
    Mockito.verify(firstDAO).saveObject(myObject); 
    

    问题在于将对象内容设置为null 是您的方法的副作用。因此,Mockito 将记录的参数(具有有效内容)与您的方法修改的对象(内容已设置为 null)进行比较。

    在这种情况下,我该如何测试呢? ——阿比拉什·帕尼格拉希

    在测试中将myObject设为Mockito.spy()并阻止setContent()的执行:

    @Test
    public void testSaveFeature()
    {
        //initialize all objects
        MyObject spyOfMyObject = Mockito.spy(myObject);
        doNothing().when(spyOfMyObject).setContent(null); // special null matcher may be needed...
    
        obj.saveToMultipleSources(spyOfMyObject); 
    
        Mockito.verify(firstDAO).saveObject(spyOfMyObject); 
        Mockito.verify(spyOfMyObject).setContent(null);
        Mockito.verify(secondDAO).saveObject(spyOfMyObject);
    }
    

    但您很可能希望确定myObject.setContent(null); 在 econdDAO.saveObject(myObject);`...

    之前调用
    @Test
    public void testSaveFeature()
    {
        //initialize all objects
        MyObject spyOfMyObject = Mockito.spy(myObject);
        doNothing().when(spyOfMyObject).setContent(null);
    
        obj.saveToMultipleSources(spyOfMyObject); 
    
        Mockito.verify(firstDAO).saveObject(spyOfMyObject); 
        InOrder inOrder = Mockito.inOrder(spyOfMyObject,secondDAO);
        inOrder.verify(spyOfMyObject).setContent(null);
        inOrder..verify(secondDAO).saveObject(spyOfMyObject);
    }
    

    【讨论】:

    • 所以你的意思是,虽然实际调用是内容,但由于在执行测试方法的过程中将 null 设置为对象,我得到了错误?在这种情况下,我该如何测试呢?或者我如何编辑 src 以使测试变得更容易?我不赞成创建对象的深层副本并将副本对象的内容属性设置为 null。
    猜你喜欢
    • 2019-04-04
    • 2011-04-06
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多