RedisTemplate mock 仅在测试中有效 class
RedisTemplate mock is only working in the test class
Class A{
@Autowired
private RedisTemplate<String, Object> redisTemplate;
private String readFromCache(String bucket, String key) {
Object object = redisTemplate.opsForHash().get(bucketName, key);
System.out.println("----" + redisTemplate.opsForHash().get("1", "1"));
String returnValue = "";
if (Objects.nonNull(object))
returnValue = object.toString();
return returnValue;
}
}
Class B
Class B extends A{
someMethod(){
readFromCache(bucketName , key);
}
}
现在,当我为 class B 中的方法编写测试时,即 someMethod()。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
@ActiveProfiles("test")
ClassBTest(){
@InjectMocks
Class B
@Mock
@Qualifier("redisTemplate")
RedisTemplate<String, Object> redisTemplate;
@Mock
HashOperations<String, Object, Object> hashOpertaions;
@Test
someMethodTest(){
Mockito.when(redisTemplate.opsForHash()).thenReturn(hashOpertaions);
Mockito.doReturn("aa").when(hashOpertaions).get(Mockito.any(), Mockito.any());
someMethod();
//assertions
}
}
我观察到 redis 模板 mock 在测试 class 中生成,但在 Class A 和 class B
中没有生成
里面ClassBTest
里面classB
为什么模拟在 class B 和 A 中不起作用?
您没有将模拟注入到您正在测试的服务中。可以在要测试的 类 之前使用 @InjectMocks
来完成。你可以试试:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
@ActiveProfiles("test")
ClassBTest(){
@Mock
RedisTemplate<String, Object> redisTemplate;
@Mock
HashOperations<String, Object, Object> hashOpertaions;
@InjectMocks
B objectOfB; // this would inject the created mocks into the class
@Test
someMethodTest(){
Mockito.when(redisTemplate.opsForHash()).thenReturn(hashOpertaions);
Mockito.doReturn("aa").when(hashOpertaions).get(Mockito.any(), Mockito.any());
objectOfB.someMethod();
//assertions
}
}
我的问题现在已经解决了。这对我有用
@MockBean
@Qualifier("redisTemplate")
RedisTemplate<String, Object> redisTemplate;
@MockBean
HashOperations<String, Object, Object> hashOpertaions;
@MockBean
RedisKeyValueAdapter redisKeyValueAdapter;
Class A{
@Autowired
private RedisTemplate<String, Object> redisTemplate;
private String readFromCache(String bucket, String key) {
Object object = redisTemplate.opsForHash().get(bucketName, key);
System.out.println("----" + redisTemplate.opsForHash().get("1", "1"));
String returnValue = "";
if (Objects.nonNull(object))
returnValue = object.toString();
return returnValue;
}
}
Class B
Class B extends A{
someMethod(){
readFromCache(bucketName , key);
}
}
现在,当我为 class B 中的方法编写测试时,即 someMethod()。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
@ActiveProfiles("test")
ClassBTest(){
@InjectMocks
Class B
@Mock
@Qualifier("redisTemplate")
RedisTemplate<String, Object> redisTemplate;
@Mock
HashOperations<String, Object, Object> hashOpertaions;
@Test
someMethodTest(){
Mockito.when(redisTemplate.opsForHash()).thenReturn(hashOpertaions);
Mockito.doReturn("aa").when(hashOpertaions).get(Mockito.any(), Mockito.any());
someMethod();
//assertions
}
}
我观察到 redis 模板 mock 在测试 class 中生成,但在 Class A 和 class B
中没有生成里面ClassBTest
里面classB
为什么模拟在 class B 和 A 中不起作用?
您没有将模拟注入到您正在测试的服务中。可以在要测试的 类 之前使用 @InjectMocks
来完成。你可以试试:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
@ActiveProfiles("test")
ClassBTest(){
@Mock
RedisTemplate<String, Object> redisTemplate;
@Mock
HashOperations<String, Object, Object> hashOpertaions;
@InjectMocks
B objectOfB; // this would inject the created mocks into the class
@Test
someMethodTest(){
Mockito.when(redisTemplate.opsForHash()).thenReturn(hashOpertaions);
Mockito.doReturn("aa").when(hashOpertaions).get(Mockito.any(), Mockito.any());
objectOfB.someMethod();
//assertions
}
}
我的问题现在已经解决了。这对我有用
@MockBean
@Qualifier("redisTemplate")
RedisTemplate<String, Object> redisTemplate;
@MockBean
HashOperations<String, Object, Object> hashOpertaions;
@MockBean
RedisKeyValueAdapter redisKeyValueAdapter;