【问题标题】:Mock redis template模拟 redis 模板
【发布时间】:2017-09-04 07:39:49
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    你可以像这样模拟 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());
    }
    

    【讨论】:

      【解决方案2】:

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

      @Spy
      private RedisTemplate redisTemplate = new RedisTemplate();
      

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

      【讨论】:

        【解决方案3】:

        当我面临类似的任务时,我已经制作了一个基于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>
        

        【讨论】:

          【解决方案4】:

          对于那些想要对 HashOperations get()put() 做同样事情的人

              @Mock
              RedisTemplate<String, String> redisTemplate;
              
              @Mock
              private HashOperations hashOperations;
               
              @Test
              void getFromCache() {
                   Mockito.when(redisTemplate.opsForHash()).thenReturn(hashOperations);
                   when(hashOperations.get("test-key", "test-hash-key")).thenReturn("value123");
                   RedisCacheServiceImpl cacheService = new RedisCacheServiceImpl(redisTemplate);
                   assertEquals("value123", cacheService.getFromCache("test-key", "test-hash-key"));
              }
          

          希望对你有所帮助;)

          【讨论】:

            【解决方案5】:

            我尝试了各种绝地模拟库,这是唯一一个使用池化资源的库。其他库,服务器甚至没有启动,有些需要本地 redis 才能启动和运行。这是最适合junit的

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

            【讨论】:

              【解决方案6】:

              即使我也面临类似的问题。

              我修复它的步骤 -

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

              【讨论】:

                猜你喜欢
                • 2014-11-28
                • 2016-09-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-06-19
                • 2017-11-01
                • 2020-12-17
                • 2011-03-20
                相关资源
                最近更新 更多