我正在尝试测试以下方法
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/