我如何模拟真实对象的方法并访问方法参数?

时间:2016-11-03 19:53:34

标签: java unit-testing mockito

我正在使用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;
});

运行真正的方法而不是模拟方法。我怎么能让我的测试运行我的模拟方法,并能够访问模拟方法内的参数?谢谢!

2 个答案:

答案 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";
        }
    };
}

通过这种方式,您可以完全控制重写方法, 并且该类的其余行为没有改变。