模拟redis模板

时间:2017-04-09 04:57:46

标签: java unit-testing redis mockito spring-data-redis

我在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"));   
    }    
}

5 个答案:

答案 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的

https://github.com/50onRed/mock-jedis

答案 4 :(得分:0)

即使我遇到了类似的问题。

逐步解决问题-

  1. 在我的测试类中添加了@ExtendWith(SpringExtension.class)批注。
  2. 用@MockBean注释RedisTemplate
@MockBean
private RedisTemplate<Integer, String> redisTemplate;
  1. 在我的测试方法中,我使用了ReflectionTestUtils设置redisTemplate字段。
ReflectionTestUtils.setField(rm, "redisTemplate", redisTemplate);