我有一个具有以下方法的界面
public interface IRemoteStore {
<T> Optional<T> get(String cacheName, String key, String ... rest);
}
实现该接口的类的实例称为remoteStore。
当我用mockito模仿时,并在以下时间使用该方法:
Mockito.when(remoteStore.get("a", "b")).thenReturn("lol");
我收到错误:
无法解析方法'thenReturn(java.lang.String)'
我认为这与get返回Optional类的实例这一事实有关,所以我尝试了这个:
Mockito.<Optional<String>>when(remoteStore.get("cache-name", "cache-key")).thenReturn
(Optional.of("lol"));
但是,我得到了这个错误:
当Mockito中的(可选'&lt;'String'&gt;')无法应用于(可选'&lt;'对象'&gt;')时。
它唯一有效的时间是:
String returnCacheValueString = "lol";
Optional<Object> returnCacheValue = Optional.of((Object) returnCacheValueString);
Mockito.<Optional<Object>>when(remotestore.get("cache-name", "cache-key")).thenReturn(returnCacheValue);
但上面会返回一个Optional'&lt;'Object'&gt;'的实例而不是可选'&lt;'String'&gt;。
为什么我不能只返回Optional'&lt;'String'&gt;'的实例直?如果可以,我该怎么做呢?
答案 0 :(得分:27)
返回的模拟期望返回类型与模拟对象的返回类型匹配。
这就是错误:
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);
归因于returnCacheValue
是Optional
。
这很容易修复:只需将其更改为Optional.of("lol")
。
Mockito.when(remoteStore.get("a", "b")).thenReturn(Optional.of("lol"));
您也可以取消类型证人;上述结果将推断为Optional<String>
。
答案 1 :(得分:1)
不确定为什么会看到错误,但这对我编译/运行没有错误:
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);
}
}