是否需要在使用 Mockito 模拟的对象上定义 doNothing()/when()

Is it required to define doNothing()/when() on Objects mocked using Mockito

我正在使用 JUnit5 和 Mockito 为 class Main.java.

编写单元测试

依赖项class ExternalApi.java被注入Main.java.

这是我的 MainTest.java:

@ExtendWith(MockitoExtension.class)
public class MainTest {
    @InjectMocks
    Main main;

    @Mock
    ExternalApi externalApi;

    @Test
    void testAbcMethod() {

    }
}

Main.java 中的 abc() 方法调用 externalApi.doSomething() 做一些事情。

我不想在我的测试中调用这个原始的 externalApi 方法。我需要定义吗

doNothing().when(externalApi).when(doSomething());

还是足以模拟 ExternalApi

当我们没有定义调用模拟对象的方法时会发生什么?

任何 happens.Mocking 都不够,因为调用的不是真正的 class/method,而是模拟的。

如果您监视了实例,那将触发真正的方法调用。只有这样,您才会考虑使用 doNothing 来抑制方法行为。


@Test
public void whenNotDefineBehaviorOnMock_thenCorrect() {
    List mockList = Mockito.mock(ArrayList.class);
    
   // No behavior defined,
    mockList.add("one");
    Mockito.verify(mockList).add("one");
   // Size is still empty
    assertEquals(0, mockList.size());

   // Behavior defined
    Mockito.when(mockList.size()).thenReturn(100);
    assertEquals(100, mockList.size());
}