【问题标题】:Cannot mock/spy class java.util.Optional无法模拟/监视类 java.util.Optional
【发布时间】:2019-10-30 21:16:25
【问题描述】:

我正在尝试实现这个 JUnit 代码:

private BinlistsService binlistsService = Mockito.mock(BinlistsService.class);

@Mock
Optional<BinLists> binList = null;

@BeforeEach
    public void beforeEachTest() throws IOException {

        BinLists binLists = new BinLists();
        binLists.setId(1);
        ....

        binList = Optional.of(binLists);
    }

    @Test
    public void testBinCountryCheckFilterImpl() {

        when(binlistsService.findByName(anyString())).thenReturn(binList);

}

但我得到了这个错误堆栈:

org.mockito.exceptions.base.MockitoException: 
Cannot mock/spy class java.util.Optional
Mockito cannot mock/spy because :
 - final class
    at org.data

你知道我该如何解决这个问题吗?

【问题讨论】:

  • Optional 不需要任何 mock
  • 好的,我该如何解决这个问题?请给我看代码示例好吗?

标签: java junit mockito junit5


【解决方案1】:

删除Optional&lt;BinLists&gt; 字段中的@Mock

Optional 是一个简单的类,您可以轻松创建和控制它,因此您不需要模拟它。只需在需要时创建一个实际实例,您已经在beforeEachTest() 中完成了它:

private BinlistsService binlistsService = Mockito.mock(BinlistsService.class);

Optional<BinLists> binList = null;

    @BeforeEach
    public void beforeEachTest() throws IOException {

        BinLists binLists = new BinLists();
        binLists.setId(1);
        ....

        binList = Optional.of(binLists);
    }

    @Test
    public void testBinCountryCheckFilterImpl() {

        when(binlistsService.findByName(anyString())).thenReturn(binList);

}

【讨论】:

    【解决方案2】:

    class Optional(java核心类final)不需要mock,class BinLists需要mock

        @Mock
        BinLists binList = null;
    

    JUnit 无法模拟最终类,但如果您需要这种不寻常的模拟技术,可以使用 PowerMock https://github.com/powermock/powermock

    【讨论】:

    • 我想你想说Mockito 而不是JUnit can't mock the final class,但这也不是真的。使用最新版本的Mockito,您可以enable final mocking
    • 我最近一直在测试 Mockito,但我还没有达到那个功能,非常好的信息。我会试试的!
    猜你喜欢
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    相关资源
    最近更新 更多