使用返回 Optional<T> 的方法出现 Mockito 错误

2022-09-01 00:07:23

我有一个使用以下方法的接口

public interface IRemoteStore {

    <T> Optional<T> get(String cacheName, String key, String ... rest);

}

实现接口的类的实例称为 remoteStore。

当我用moctorito嘲笑这个,并在以下情况下使用该方法时:

Mockito.when(remoteStore.get("a", "b")).thenReturn("lol");

我收到错误:

无法解析该方法thenReturn(java.lang.String)

我认为这与get返回Optant类的实例这一事实有关,所以我尝试了以下方法:

Mockito.<Optional<String>>when(remoteStore.get("cache-name", "cache-key")).thenReturn
        (Optional.of("lol"));

但是,我得到这个错误:

当 Mockito 中的 () 不能应用于 ()。Optional<String>Optional<Object>

它唯一一次工作是这样的:

String returnCacheValueString = "lol";
Optional<Object> returnCacheValue = Optional.of((Object) returnCacheValueString);
Mockito.<Optional<Object>>when(remotestore.get("cache-name", "cache-key")).thenReturn(returnCacheValue);

但上面返回的实例,而不是 。Optional<Object>Optional<String>

为什么我不能直接返回 一个实例?如果可以的话,我该怎么做呢?Optional<String>


答案 1

返回的模拟期望返回类型与模拟对象的返回类型匹配。

这是错误:

Mockito.when(remoteStore.get("a", "b")).thenReturn("lol");

"lol"不是 ,因此它不会接受它作为有效的返回值。Optional<String>

当你这样做时,它起作用的原因

Optional<Object> returnCacheValue = Optional.of((Object) returnCacheValueString);
Mockito.<Optional<Object>>when(remotestore.get("cache-name", "cache-key")).thenReturn(returnCacheValue);

是由于是 .returnCacheValueOptional

这很容易修复:只需将其更改为 a 即可。Optional.of("lol")

Mockito.when(remoteStore.get("a", "b")).thenReturn(Optional.of("lol"));

您也可以取消类型见证人。上面的结果将被推断为 。Optional<String>


答案 2

不知道为什么你看到错误,但这编译/运行对我来说没有错误:

public class RemoteStoreTest {
    public interface IRemoteStore {
        <T> Optional<T> get(String cacheName, String key);
    }
    public static class RemoteStore implements IRemoteStore {
        @Override
        public <T> Optional<T> get(String cacheName, String key) {
            return Optional.empty();
        }
    }

    @Test
    public void testGet() {
        RemoteStore remoteStore = Mockito.mock(RemoteStore.class);

        Mockito.when( remoteStore.get("a", "b") ).thenReturn( Optional.of("lol") );
        Mockito.<Optional<Object>>when( remoteStore.get("b", "c") ).thenReturn( Optional.of("lol") );

        Optional<String> o1 = remoteStore.get("a", "b");
        Optional<Object> o2 = remoteStore.get("b", "c");

        Assert.assertEquals( "lol", o1.get() );
        Assert.assertEquals( "lol", o2.get() );
        Mockito.verify(remoteStore);
    }
}

推荐