我正在使用Mockito
在我的Java代码中编写一些测试。在我的测试中,我有一个真实的对象,但我想模拟其中一个方法中发生的事情,并能够访问方法参数。
如果我这样做:
MyObj spyObj = spy(new MyObj());
doReturn(false).when(spyObj).myMethod(anyObject(), anyObject(), anyList(), anyLong());
我无法访问参数并使用它们做任何逻辑。
但是,如果我这样使用Mockito.when()
:
when(spyObj.myMethod(anyObject(), anyObject(), anyList(), anyLong())).thenAnswer(invocation -> {
if (invocation.getArguments()[0] == 1) {
// do stuff
return true;
}
return false;
});
运行真正的方法而不是模拟方法。我怎么能让我的测试运行我的模拟方法,并能够访问模拟方法内的参数?谢谢!
答案 0 :(得分:1)
您想要的语法是
doAnswer(invocation -> { whatever }).when(spyObj).myMethod( whatever );
这允许您存储间谍的方法,而不实际调用它。
答案 1 :(得分:1)
也许你不需要模拟。扩展和覆盖。
例如,如果您有这样的类:
class Person {
String login(String username, String password) {
return LoginManager.login(username, password);
}
}
请注意无法轻松注入的静态调用LoginManager.login
。
您可以创建Person
的匿名子类并覆盖login
方法,并根据需要执行此操作:
@Test
public void test_something() {
Person person = new Person() {
@Override
String login(String username, String password) {
return "whatever";
}
};
}
通过这种方式,您可以完全控制重写方法, 并且该类的其余行为没有改变。