【问题标题】:JUnit 5 Mockito Stubbing Referenced Method and Verifying it was CalledJUnit 5 Mockito 存根引用的方法并验证它是否被调用
【发布时间】:2020-05-03 20:41:22
【问题描述】:

我正在使用 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 值。如何参数化模拟方法引用?

【问题讨论】:

  • 我缺少 MockService 类,但由于 MockService 不是功能接口,因此无法编译并抱怨“对象不是功能接口”。
  • @Mock 字段不需要是功能接口。 Supplier 是方法引用正在实现的功能接口。
  • @HaimRaman 当approveCall 和dellCall 返回void 以外的东西时编译。

标签: mockito junit5


【解决方案1】:

我用一些函数式/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();
    }
}

【讨论】:

  • 这就是我最终要做的。但是,您没有涵盖对模拟进行存根。这会产生很多我想避免的代码重复......我会接受这个答案作为解决方法,即使实际答案是No, Mockito does not support this
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-21
  • 2014-01-21
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
相关资源
最近更新 更多