代码之家  ›  专栏  ›  技术社区  ›  Michael Bavin

mockito:如何在不模拟所有参数的情况下轻松地存根方法

  •  20
  • Michael Bavin  · 技术社区  · 16 年前

    我有一个方法我想存根,但它有很多参数。 我如何避免模拟所有参数,但仍然存根方法。

    前任:

    //Method to stub
    public void myMethod(Bar bar, Foo foo, FooBar fooBar, BarFoo barFoo, .....endless list of parameters..);
    
    3 回复  |  直到 13 年前
        1
  •  27
  •   SteveD    16 年前

    我不太明白你用mockito有什么问题。假设您创建了包含 myMethod() 方法,则只能验证您感兴趣的方法的参数。例如(假设接口被调用 MyInterface 使用JUnit4):

    @Test
    public void test() {
        MyInterface myInterface = mock(MyInterface.class);
        FooBar expectedFooBar = new FooBar();        
    
        // other testing stuff
    
        verify(myInterface).myMethod(any(), any(), eq(expectedFooBar), any(), ...);
    }
    

    您需要对mockito方法执行静态导入才能使其工作。这个 any() matcher不关心验证时传递了什么值。

    无法避免为方法中的每个参数传递某些内容(即使它仅为空)。

        2
  •  10
  •   Luis Ramirez-Monterosa    13 年前

    使用mockito.any

    例如,如果myobj mymethod接受string、string、bar

    接听电话

    Mockito.when(myojb.myMethod(Mockito.anyString(),Mockito.anyString(),Mockito.any(Bar.class)))
        .thenReturn(amockedobject);
    

    为了证实史蒂文已经给出了答案

    Mockito.verify(myojb).myMethod(
        Mockito.anyString(),Mockito.anyString(),Mockito.any(Bar.class)));
    
        3
  •  3
  •   Aaron Digulla    16 年前

    创建一个包装类,它调用real方法并填充除您提供的参数以外的所有参数(也称为“委托”)。

    在下一次机会中,针对要求将参数移动到配置对象的项目提交一个bug。