Java 捕获以前的值以验证模拟对象
在mockito中,是否可以捕获传递给mock对象方法的对象字段的前一个值集(例如,被测试的方法执行此操作)Java 捕获以前的值以验证模拟对象,java,junit,mocking,mockito,Java,Junit,Mocking,Mockito,在mockito中,是否可以捕获传递给mock对象方法的对象字段的前一个值集(例如,被测试的方法执行此操作) public void methodUnderTest(){ Person person = new Person(); person.setAge(5); someObject.setPerson(person); ... person.setAge(6); someObject.setPerson(person);
public void methodUnderTest(){
Person person = new Person();
person.setAge(5);
someObject.setPerson(person);
...
person.setAge(6);
someObject.setPerson(person);
}
我想知道的是,如果我模拟someObject,我是否能够验证someObject对单个对象“person”执行了两次setPerson,但当setPerson发生时,该对象的年龄值不同?我试着使用ArgumentCaptor,但由于我通过了同一个对象,我只能得到最后一个年龄
ArgumentCaptor<Integer> arg = ArgumentCaptor.forClass(Integer.class);
verify(mockObject).setPerson(arg.capture());
List<Integer> captureList = arg.getAllValues();
captureList.get(0).getAge(); // returns 6
captureList.get(1).getAge(); // returns 6
你就不能这么做吗
verify(mockedList, times(1)).setPerson(eq(5));
verify(mockedList, times(2)).setPerson(eq(6));
我已经有一段时间没有使用mockito了,所以我认为这是正确的语法
或者您是否需要出于断言以外的其他原因捕获值?不幸的是,您不能使用
ArgumentCaptor
捕获值。
捕获者只存储对参数的引用;在这种情况下,它存储两次对同一对象person的引用
每次调用setPerson
方法时,您应该尝试使用答案执行正确的检查
这与您正在尝试做的事情有关。我认为使用Mockito是不可能的。您可以重写代码,使其成为“单元可测试的”,或者通过使用TDD方法先编写测试,然后再编写代码,使其更好
但是,如果由于某些原因无法修改代码,则可以使用。例如,PowerMockito.whenNew
将允许您提供a
的模拟。但不建议采用这种方法
verify(mockedList, times(1)).setPerson(eq(5));
verify(mockedList, times(2)).setPerson(eq(6));