2014-06-27 6 views
5

Nel mio controller ho un codice simile al seguente. RedisTemplate stringRedisTemplateTest unità di controllo Come posso simulare RedisTemplate opsForValue con tipo restituito ValueOperations

def accessRedis() 
{ 
    val = stringRedisTemplate.opsForValue().get('Key') 
} 

Nel mio test di controllo, ho intenzione di iniettare un RedisTemplate deriso che restituiscono un ValueOperations deriso. Il mio codice:

def template = mockFor(RedisTemplate)  
def val = mockFor(org.springframework.data.redis.core.ValueOperations) 
val.demand.get {p-> println "$p"} 
template.demand.opsForValue { 
    return val.createMock() 
} 

controller.stringRedisTemplate = template.createMock() 
controller.accessRedis() 

Tuttavia, ho ottenuto il seguente errore: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Impossibile il cast di oggetti'com.tnd[email protected]1aa55dd5 'con classe' com.tnd.viewport.ui.AppHawkControllerSpec $ _ $ spock_feature_0_1_closure2 'alla classe' org.springframework.data.redis.core.ValueOperations '

Potresti consigliare una soluzione per il mio scenario? Grazie!

risposta

1
redisTemplate = mock(RedisTemplate.class); 
     Whitebox.setInternalState(loginService, "redisTemplate", redisTemplate); 

List<Object> list = new ArrayList<Object>(); 
     list.add(15l); 
     List<Object> keys = new ArrayList<>(); 
     keys.addAll(Arrays.asList("15")); 

HashOperations<Serializable, Object, Object> hashOperations =mock(HashOperations.class); 

when(redisTemplate.opsForHash()).thenReturn(hashOperations); 
     when(hashOperations.multiGet(anyString(), anyListOf(Object.class))).thenReturn(list); 
+4

Si prega di aggiungere una spiegazione per rendere la risposta più comprensibile. –