【问题标题】:How would I mock a method of a real object and access the method arguments?我将如何模拟真实对象的方法并访问方法参数?
【发布时间】:2016-11-03 19:53:33
【问题描述】:

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

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

【问题讨论】:

标签: java unit-testing mockito


【解决方案1】:

你想要的语法是

doAnswer(invocation -> { whatever }).when(spyObj).myMethod( whatever );

这使您可以存根间谍的方法,而无需实际调用它。

【讨论】:

    【解决方案2】:

    也许您不需要模拟。扩展和覆盖。

    例如,如果您有这样的课程:

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

    这样你就可以完全控制被覆盖的方法, 并且该类的其余行为保持不变。

    【讨论】:

    • 这也是我的想法。问题在于无法扩展的不可变类和最终类
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 2011-12-21
    相关资源
    最近更新 更多