Mockito:当任何实例调用方法时,然后返回一些东西

Mockito: When any instance invokes method, thenReturn something

我是 Mockito 的新手,class 喜欢

public class A {
   private B b;
   public B getB() { return b; }
   // ...
}

public class B {
   private C c;
   public C getC() { return c; }
   // ...
}

我正在使用 Mockito 为 class A 编写单元测试,并尝试实现以下行为,其中 B 是模拟:

when(a.getB().getC()).thenReturn(mock(C.class))
when(any(mock(C.class)).doSomething()).thenReturn("somethingElse") // This doesn't work.

当 C 的任何模拟实例调用 doSomething() 时,我如何 return "somethingElse"?我不想将此行为绑定到任何一个特定的 mock(C.class) 实例。

不要添加用于创建新模拟的 ```mock()``。

像这样

when(any(C.class).doSomething()).thenReturn("somethingElse");

首先,你得把你的测试对象当成一个单元来对待,其他的都mock。因此,由于您正在测试 class A,因此您不能模拟 As 方法。

以下是如何使用 Mockito 使用注释模拟 B 的实例:

@MockitoSettings
public class ATest {
  @Mock
  private B b;
  @InjectMocks
  private A a;

  @Test
  void testExample() {
    C c = mock(C.class):
    when(b.getC()).thenReturn(c);
    when(c.doSomething()).thenReturn("somethingElse");
    
    // a.getB() == b
  }
}

那么这里发生了什么?

注解 @Mock 正在初始化一个类型为 B 的模拟对象并为其设置字段变量 b

@InjectMocks 正在收集所有 @Mock 字段并在对象中设置字段。这是你的测试对象。

现在您的 A 实例有一个模拟的 B 对象。在 B 中,您有 C。由于 B 是一个模拟对象,因此 getC() 方法根本不做任何事情。你必须用一些功能来存根它。在测试中,我已经初始化了一个本地模拟 C 实例以从 getC().

返回

所以现在当 A 对象访问模拟的 B 并获得 C 时,它将使用这个局部变量 c。所以你可以用模拟函数存根这个对象。