首页 > 解决方案 > JUnit 5 Mockito 存根引用的方法并验证它是否被调用

问题描述

我正在使用 JUnit5 及其ParameterizedTest功能。如何使用方法引用作为数据源的一部分?

例子:

public enum Status {
  APPROVE, DECLINE
}

@Mock
public MockService mockService;

// Normal Test
@Test
void testApprove() {
  Mockito.doReturn(null)
    .when(mockService)
    .approveCall();

  Mockito.verify(mockService).approveCall();
}

// Parameterized Test
Map<Status, Supplier<?>> mockMap = Map.ofEntries(  // Java 9 method
  Map.entry(APPROVE, mockService::approveCall),
  Map.entry(DECLINE, mockService::declineCall)
);

@ParameterizedTest
@EnumSource(Status.class)
void test(Status status) {
  Supplier<?> supplier = mockMap.get(status);

  ??
}

我希望我的第二个测试与我的第一个测试做同样的事情,但也涵盖了DECLINE价值。如何参数化模拟方法引用?

标签: mockitojunit5

解决方案


我使用了一些函数式/lambda 技巧来解决它。

public class MyTest {
    public enum Status {
        APPROVE, DECLINE
    }

    @Mock
    public MockService mockService;


    // Parameterized Test
    Map<Status, MockitoVerifier> mockMap = Map.ofEntries(  // Java 9 method
            Map.entry(Status.APPROVE, () -> Mockito.verify(mockService).approveCall()),
            Map.entry(Status.DECLINE, () -> Mockito.verify(mockService).declineCall())
    );

    @ParameterizedTest
    @EnumSource(Status.class)
    void test(Status status) {
        MockitoVerifier<?> verifier = mockMap.get(status);
        verifier.verify();
    }

    @FunctionalInterface
    interface MockitoVerifier<T> {
        T verify();
    }
}

推荐阅读