Java 捕获以前的值以验证模拟对象

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);

在mockito中,是否可以捕获传递给mock对象方法的对象字段的前一个值集(例如,被测试的方法执行此操作)

    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));