我在mock redis模板中面临一个问题。 任何人都可以帮助我为下面的课程编写单元测试。
@Repository
public class CasheRepo {
@Autowired
private RedisTemplate<String, Object> template;
public Object getObject(final String key) {
return template.opsForValue().get(key);
}
}
以下是单元测试类。但它没有用。它显示了零点异常
@RunWith(MockitoJUnitRunner.class)
public class CashRepoTest {
@InjectMocks
private CasheRepo casheRepo = new CasheRepo();
private @Mock RedisConnection redisConnectionMock;
private @Mock RedisConnectionFactory redisConnectionFactoryMock;
private RedisTemplate redisTemplate;
@Before
public void setUp() { Mockito.when(redisConnectionFactoryMock.getConnection()).thenReturn(redisConnectionMock);
redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(redisConnectionFactoryMock);
redisTemplate.afterPropertiesSet();
}
@Test
public void getObjectTest() {
Mockito.doNothing().when(redisTemplate).opsForValue().set("spring", "data");
redisTemplate.afterPropertiesSet();
System.out.println(redisTemplate.opsForValue().get("spring"));
}
}
答案 0 :(得分:2)
你可以像这样模拟redisTemplate:
@Mock RedisTemplate redisTemplate;
@Mock
private ValueOperations valueOperations;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
Mockito.when(redisTemplate.opsForValue()).thenReturn(valueOperations);
Mockito.doNothing().when(valueOperations).set(anyString(), anyString());
}
答案 1 :(得分:1)
虽然我面临类似的任务,但我已经基于mock-jedis制作了一个工具(注释)以轻松地解决它。您可以在https://github.com/incu6us/redis-mock-template上阅读它,也可以在项目中添加依赖项:
<dependency>
<groupId>com.github.incu6us.redis</groupId>
<artifactId>redis-mock-template</artifactId>
<version>0.0.1</version>
</dependency>
答案 2 :(得分:0)
您正在通过构造函数创建redisTemplate,并且DI没有获得它。尝试使用@Spy注释:
@Spy
private RedisTemplate redisTemplate = new RedisTemplate();
它将允许DI注入您的RedisTemplate实例。
答案 3 :(得分:0)
我尝试了各种jedis模拟库,这是唯一使用池化资源的库。在其他库中,服务器甚至没有启动,并且某些库需要重新启动并运行。这是最适合junit的
答案 4 :(得分:0)
即使我遇到了类似的问题。
逐步解决问题-
@MockBean
private RedisTemplate<Integer, String> redisTemplate;
ReflectionTestUtils.setField(rm, "redisTemplate", redisTemplate);