我正在尝试模拟一个签名为:
public A doSomething(B b, String str){}
我尝试使用 doAnswer 更新 str 值。但是,此方法返回对象 A,并有条件地设置值。我无法找到一种方法来设置要传递给此方法的特定 str 值。谁能让我知道这是如何实现的?我不能在我的项目中使用 powermock。
对于一次性模拟,您可以使用InvocationOnMock.getArguments
来获取 str
的值:
doAnswer(new Answer<Foo>() {
@Override public Foo answer(InvocationOnMock invocation) {
A a = mock(A.class);
when(a.someMethod()).thenReturn((String) (invocation.getArguments()[0]));
return a;
}
}).when(yourObject).doSomething(any(B.class), anyString());
// or with Java 8:
doAnswer(invocation => {
A a = mock(A.class);
when(a.someMethod()).thenReturn((String) (invocation.getArguments()[0]));
return a;
}).when(yourObject).doSomething(any(), anyString());
。但只要该方法是可模拟的(可见和非最终的(,你也可以将新方法内联编写为匿名内部子类(或在其他地方定义的静态子类(,这可以完成同样的事情,而无需太多的强制转换和 Mockito 语法:
YourObject yourObject = new YourObject() {
@Override public A someMethod(B b, String str) {
A a = mock(A.class);
when(a.someMethod()).thenReturn(str);
return a;
}
};