4

在 mockito 中,是否可以捕获先前设置为传递给模拟对象方法的对象字段的值,例如被测方法执行此操作

    public void methodUnderTest(){
    Person person = new Person();
    person.setAge(5);
    someObject.setPerson(person);

     ...

    person.setAge(6); 
    someObject.setPerson(person);
    }

我想知道的是,如果我模拟 someObject,我是否能够验证 someObject 对单个对象“人”执行了两次 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

我也试过做

    InOrder in = inOrder(mockObject);
    in.verify(mockObject).setPerson(arg.capture());
    assertEquals(5, arg.getValue().getAge()); //fails
4

3 回答 3

4

不幸的是,你不能用ArgumentCaptor. 捕获者仅存储对参数的引用;在这种情况下,它存储了两次对同一对象person的引用。

您应该尝试使用Answer, 在每次setPerson调用该方法时执行正确的检查。

这个mockito 问题与您正在尝试做的事情有关。

于 2012-08-16T09:50:36.697 回答
0

你不能就这样吗

verify(mockedList, times(1)).setPerson(eq(5));
verify(mockedList, times(2)).setPerson(eq(6));

自从我使用 mockito 以来已经有一段时间了,所以我认为这是正确的语法。

或者您是否需要出于断言以外的其他原因来捕获该值?

于 2012-08-16T09:42:36.827 回答
0

我认为使用 Mockito 是不可能的。您可以重写您的代码以使其“可单元测试”或更好,方法是先编写测试,然后以 TDD 方法编写代码。

但是,如果由于某些原因您无法修改代码,则可以使用PowerMock 功能。例如PowerMockito.whenNew将允许您提供一个模拟的A. 但不推荐这种方法。

于 2012-08-16T10:01:37.663 回答