我正在為我的CacheService班級撰寫單元測驗:
public class CacheService {
private final HashOperations<String, String, String> redisHashOps;
private final ValueOperations<String, String> valueOps;
private final SetOperations<String, String> setOps;
public CacheService(StringRedisTemplate redisTemplate) {
this.redisHashOps = redisTemplate.opsForHash();
this.valueOps = redisTemplate.opsForValue();
this.setOps = redisTemplate.opsForSet();
}
單元測驗:
public class CacheServiceTest {
private CacheService cacheService;
private HashOperations<String, String, String> redisHashOps;
private ValueOperations<String, String> redisValueOps;
private SetOperations<String, String> redisSetOps;
@BeforeEach
public void setUp() {
final StringRedisTemplate redisTemplate = mock(StringRedisTemplate.class);
redisValueOps = mock(ValueOperations.class);
redisHashOps = mock(HashOperations.class);
redisSetOps = mock(SetOperations.class);
when(redisTemplate.opsForValue()).thenReturn(redisValueOps);
when(redisTemplate.opsForHash()).thenReturn(redisHashOps);
when(redisTemplate.opsForSet()).thenReturn(redisSetOps);
redisValueOps并且redisSetOps沒有問題,但是對于redisHashOps,IDE 提示:

如果我構建專案將看到以下錯誤:
java: no suitable method found for thenReturn(org.springframework.data.redis.core.HashOperations<java.lang.String,java.lang.String,java.lang.String>)
method org.mockito.stubbing.OngoingStubbing.thenReturn(org.springframework.data.redis.core.HashOperations<java.lang.String,java.lang.Object,java.lang.Object>) is not applicable
(argument mismatch; org.springframework.data.redis.core.HashOperations<java.lang.String,java.lang.String,java.lang.String> cannot be converted to org.springframework.data.redis.core.HashOperations<java.lang.String,java.lang.Object,java.lang.Object>)
method org.mockito.stubbing.OngoingStubbing.thenReturn(org.springframework.data.redis.core.HashOperations<java.lang.String,java.lang.Object,java.lang.Object>,org.springframework.data.redis.core.HashOperations<java.lang.String,java.lang.Object,java.lang.Object>...) is not applicable
(argument mismatch; org.springframework.data.redis.core.HashOperations<java.lang.String,java.lang.String,java.lang.String> cannot be converted to org.springframework.data.redis.core.HashOperations<java.lang.String,java.lang.Object,java.lang.Object>)
查看RedisTemplate的原始碼發現了opsForHash和opsForValue的區別:
public <HK, HV> HashOperations<K, HK, HV> opsForHash() ...
public ValueOperations<K, V> opsForValue() ...
如何修改單元測驗以使其作業?
uj5u.com熱心網友回復:
您可以doReturn改用以下方法重寫您的模擬期望:
doReturn(redisHashOps).when(redisTemplate).opsForHash();
uj5u.com熱心網友回復:
你發現它是正確的:
在第一種(也是最后一種)情況下<K, V>是指RedisTemplate泛型引數(在<String, String>此處分配)。
在 的情況下<HK, HV> HashOperations<K, HK, HV>,K是“再次安全”,但是<HK, HV>是“方法泛型引數”,編譯器無法在此處推斷。
解決方案:
- 正如 armandino 正確建議的那樣:
我們讓編譯器免于猜測。doReturn(redisHashOps).when(redisTemplate).opsForHash(); - 或通過“通用引數”:
when(redisTemplate.<String,String>opsForHash()).thenReturn(redisHashOps); - 或“原始”/殘酷的方法:
private HashOperations<String, Object, Object> redisHashOps; ... when(redisTemplate.opsForHash()).thenReturn(redisHashOps);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/409711.html
標籤:
