2017-04-09 169 views
2

我在模拟redis模板中遇到了一个问题。 任何人都可以帮我编写下课的单元测试。模拟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

你正在创建redisTemplate通过构造函数,它不是由DI了。尝试使用@Spy注释:

@Spy 
private RedisTemplate redisTemplate = new RedisTemplate(); 

它将使DI注入你的RedisTemplate的实例。

0

你可以嘲笑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()); 
}