代码之家  ›  专栏  ›  技术社区  ›  Andrew Cheong

有没有一种方法可以写mockito.when(…)来覆盖一个方法的所有重载,即对于共享相同方法名的任何调用返回相同的内容?

  •  1
  • Andrew Cheong  · 技术社区  · 7 年前

    我有一个生成的类,它有许多重载方法, 例如

    Foo create(int)
    Foo create(String)
    Foo create(int, String)
    Foo create(String, String)
    Foo create(Foo, int, String)
    // ...
    // ...
    // ...
    Foo create(Foo, int, String, Bar, Bar, Bar, Bar, Bar, Bar)
    

    最多9个参数。

    我知道我可以

    when(mockedObj.create(any())).return(aThing);
    when(mockedObj.create(any(), any())).return(aThing);
    when(mockedObj.create(any(), any(), any())).return(aThing);
    // ...
    // ...
    // ...
    when(mockedObj.create(any(), any(), any(), any(), any(), any(), any(), any(), any())).return(aThing);
    

    但是我想知道是否有一种方法可以让一个方法的所有重载返回一件事。

    1 回复  |  直到 7 年前
        1
  •  1
  •   ernest_k Petronella    7 年前

    一种方法是在模拟类型时使用默认答案。

    从文档的 org.mockito.Mockito.mock(Class<T>, Answer) :

    使用指定的策略创建模拟,以回答交互。它是相当高级的特性,通常您不需要它来编写合适的测试。但是,它在处理遗留系统时很有用。

    它是默认答案,因此将使用它 只有当你没有 终止方法调用。

    所以可以写为:

    MockedType mockedObj = Mockito.mock(MockedType.class, invocation -> aThing);
    

    这个会回来的 aThing 默认情况下。

    但是,如果需要更多的控制,可以使用 invocation 参数来检查它是否确实是 create 这被称为(特别是为了避免 ClassCastException S):

    MockedType mockedObj = Mockito.mock(MockedType.class, 
         (Answer<Foo>) invocation -> 
                invocation.getMethod().getName()
                          .equals("create") ? aThing: null);
    
    推荐文章