2012-08-16 59 views
0

在的Mockito,是有可能捕获的先前值设置为传递给模拟对象的方法,例如一个物体的场下测试该方法执行此捕获之前的值,以验证模拟对象

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 

我也想这样做

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

回答

0

你就不能这样做

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

去过,因为我用一个的Mockito一段时间,所以我认为这是正确的语法。

或者您是否需要为断言之外的其他原因捕获值?

1

不幸的是,你不能用ArgumentCaptor来做到这一点。 捕获器只存储对参数的引用;在这种情况下,它存储两次对同一对象的引用,

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

这个mockito issue与你正在做的事情有关。

0

我认为Mockito是不可能的。你可以重写你的代码,使其成为“单元测试”,或者通过在TDD方法中编写测试代码和代码后好得多。

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