2017-04-09 54 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()); 
}