如何在Mockito参数捕获器中多次捕获同一对象

我正在编写一个Junit,以测试对象更改其变量并将其保存到数据库2次的情况。 argumentCaptor在保存操作中被调用。 getallValues()返回两个记录。但是两个值都引用到相同的最后一个捕获记录。

ImpplimentationClass.java

 ...

myobj.setVariable(oneValue);
savemyobj(myobj);
myobj.setVariable(otherValue);
savemyobj(myobj);

...

savemyobj(myobject myobj){
repository.save(myobj);
}

ImpplimentationClassTest.java


private ImplimentationClass underTest ;

@Mock
private Repository mockRepository;

@Before
public void setup(){
  initMocks(this);
  underTest = new ImplimentationClassTest();
}

@Test
public void test(){
ArgumentCaptor<myobject> captor = ArgumentCaptor.forClass(myobject.class);
myobject obj = new myobject(value);
underTest.implementedMethod(obj);
verify(mockRepository,times(2)).save(captor.capture());
assertEquals(oneValue,captor.getallValues().get(0).getVariable()); //failing here -getting otherValue
assertEquals(otherValue,captor.getallValues().get(1).getVariable());

}

有什么想法可以多次捕获同一对象吗?

aishenghuo2009 回答:如何在Mockito参数捕获器中多次捕获同一对象

测试中的问题源自这段代码。

myObj.setVariable(oneValue);
saveMyObj(myObj);
myObj.setVariable(otherValue);
saveMyObj(myObj);

variable内更改myObj后,将为所有引用对其进行更改。请注意,ArgumentCaptor不会复制myObj的深层副本。 因此,您最终将获得两个对myObj的引用,它们仅具有最新状态。

为避免这种情况,您可能希望将另一个实例传递给第二个呼叫。


另一种替代方法可能是改用doAnswer并检查该方法中参数的正确性。

请查看此answer以获取示例。

本文链接:https://www.f2er.com/3107609.html

大家都在问