mockito 模仿Ruby模板

3j86kqsm  于 2022-11-08  发布在  Ruby
关注(0)|答案(7)|浏览(198)

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

42fyovps1#

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

tyky79it2#

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

@Spy
private RedisTemplate redisTemplate = new RedisTemplate();

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

w41d8nur

w41d8nur3#

对于那些想对HashOperationsput()做同样事情的人

@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"));
    }

希望对你有帮助;)

3pmvbmvn

3pmvbmvn4#

当我面临类似的任务时,我已经基于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>
tzxcd3kk

tzxcd3kk5#

我尝试了各种jedis mock库,这是唯一一个与池资源一起工作的。其他库,服务器甚至没有启动,一些需要本地redis才能启动和运行。这是junit的最佳选择。
https://github.com/50onRed/mock-jedis

t9eec4r0

t9eec4r06#

就连我也面临着类似的问题。
我修理它的步骤-
1.在我的测试类中添加了@ExtendWith(SpringExtension.class)注解。
1.使用@MockBean注解RedisTemplate

@MockBean
private RedisTemplate<Integer, String> redisTemplate;

1.在我的测试方法中,我使用了ReflectionTestUtils来设置redisTemplate字段。

ReflectionTestUtils.setField(rm, "redisTemplate", redisTemplate);
envsm3lx

envsm3lx7#

到达这里有点晚了。我的回答如下与Junit5

@ExtendWith(MockitoExtension.class)
class CashRepoTest {
   @InjectMocks
   CashRepo cashRepo;

   @Mock
   RedisTemplate<String, Object> template;

   @Mock
   ValueOperations<String, Object> valueOperations;

   @Test
   void getTest() {
      Mockito.when(template.opsForValue())
        .thenReturn(valueOperations);
      String expectedValue = "ev";
      when(valueOperations.get("test")).thenReturn(expectedValue);
      assertEquals(expectedValue, cashRepo.getObject("test"));
  }
}

相关问题