returns Optional<T> 方法的 Mockito 错误
Mockito error with method that returns Optional<T>
我有以下方法的接口
public interface IRemoteStore {
<T> Optional<T> get(String cacheName, String key, String ... rest);
}
实现该接口的 class 实例称为 remoteStore。
当我用 mockito 模拟它并使用该方法时:
Mockito.when(remoteStore.get("a", "b")).thenReturn("lol");
我收到错误:
Cannot resolved the method thenReturn(java.lang.String)
我认为这与获取 return 可选 class 的实例有关,所以我尝试了这个:
Mockito.<Optional<String>>when(remoteStore.get("cache-name", "cache-key")).thenReturn
(Optional.of("lol"));
但是,我得到了这个错误:
when (Optional<String>
) in Mockito cannot be applied to (Optional<Object>
).
唯一一次它起作用的是:
String returnCacheValueString = "lol";
Optional<Object> returnCacheValue = Optional.of((Object) returnCacheValueString);
Mockito.<Optional<Object>>when(remotestore.get("cache-name", "cache-key")).thenReturn(returnCacheValue);
但在 return 之上是 Optional<Object>
的实例,而不是 Optional<String>
。
为什么我不能直接 return Optional<String>
的实例?如果可以,我应该怎么做?
不确定为什么会看到错误,但这 compiles/runs 对我来说没有错误:
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);
}
}
模拟 return 期望 return 类型匹配模拟对象的 return 类型。
这里是错误的:
Mockito.when(remoteStore.get("a", "b")).thenReturn("lol");
"lol"
不是 Optional<String>
,因此它不会接受它作为有效的 return 值。
当你这样做时它起作用的原因
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>
.
我有以下方法的接口
public interface IRemoteStore {
<T> Optional<T> get(String cacheName, String key, String ... rest);
}
实现该接口的 class 实例称为 remoteStore。
当我用 mockito 模拟它并使用该方法时:
Mockito.when(remoteStore.get("a", "b")).thenReturn("lol");
我收到错误:
Cannot resolved the method
thenReturn(java.lang.String)
我认为这与获取 return 可选 class 的实例有关,所以我尝试了这个:
Mockito.<Optional<String>>when(remoteStore.get("cache-name", "cache-key")).thenReturn
(Optional.of("lol"));
但是,我得到了这个错误:
when (
Optional<String>
) in Mockito cannot be applied to (Optional<Object>
).
唯一一次它起作用的是:
String returnCacheValueString = "lol";
Optional<Object> returnCacheValue = Optional.of((Object) returnCacheValueString);
Mockito.<Optional<Object>>when(remotestore.get("cache-name", "cache-key")).thenReturn(returnCacheValue);
但在 return 之上是 Optional<Object>
的实例,而不是 Optional<String>
。
为什么我不能直接 return Optional<String>
的实例?如果可以,我应该怎么做?
不确定为什么会看到错误,但这 compiles/runs 对我来说没有错误:
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);
}
}
模拟 return 期望 return 类型匹配模拟对象的 return 类型。
这里是错误的:
Mockito.when(remoteStore.get("a", "b")).thenReturn("lol");
"lol"
不是 Optional<String>
,因此它不会接受它作为有效的 return 值。
当你这样做时它起作用的原因
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>
.