模拟Redis模板

lah*_*umw 6 java unit-testing mockito redis spring-data-redis

我在模拟Redis模板中遇到问题。谁能帮我为下课写单元测试。

@Repository
public class CasheRepo {

    @Autowired
    private RedisTemplate<String, Object> template;

    public Object getObject(final String key) {
    return template.opsForValue().get(key);
    }
}
Run Code Online (Sandbox Code Playgroud)

下面是单元测试课程。但这不起作用。它显示空点异常

@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"));   
    }    
}
Run Code Online (Sandbox Code Playgroud)

小智 10

你可以像这样模拟 redisTemplate:

@Mock
RedisTemplate<String, String> 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());
}
Run Code Online (Sandbox Code Playgroud)


小智 3

您正在通过构造函数创建 redisTemplate,但它不是通过 DI 获取的。尝试使用@Spy注释:

@Spy
private RedisTemplate redisTemplate = new RedisTemplate();
Run Code Online (Sandbox Code Playgroud)

它将允许 DI 注入您的 RedisTemplate 实例。