java - Mockito 的验证和参数捕获器的工作

标签 java unit-testing testing mockito

我正在尝试测试以下方法

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 的验证语句的预期参数和实际参数不同的错误。预期是一个具有有效内容的对象,但调用的实际参数将 Content 设置为 null。我也对 ArgumentCaptor 进行了完全相同的尝试,但得到了相同的结果。

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

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

最佳答案

//initialize all objects
obj.saveToMultipleSources(myObject); //myObject has a valid content.
Mockito.verify(firstDAO).saveObject(myObject); 

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

In that case, how can I test this? – Abhilash Panigrahi

在测试中将 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);
}

关于java - Mockito 的验证和参数捕获器的工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44906219/

相关文章:

Java 套接字 : My server input stream will not read from the client output stream?

unit-testing - 如果我只能使用集成测试,为什么还要打扰单元测试?

java - 如何从 . Cucumber-jvm 步骤类中的属性文件

java - NSCoding 到 java

java - 使用 shell 脚本启动和终止 java 应用程序 (Debian)

c# - 为需要 Func 并返回 IEnumerable 的 protected 虚拟方法设置 Moq 调用

unit-testing - 那里有哪些 'styles' 测试框架?

testing - 在 Grails Spock 测试中是否有输出到 STDOUT 的方法?

java - 关闭流/套接字和 try-catch-finally

python - 是否可以在不指定数据库的情况下使用 SQLAlchemy 连接到 postgres 服务器?