RedisTemplate mock 仅在测试中有效 class

RedisTemplate mock is only working in the test class

Class A{
  
@Autowired
private RedisTemplate<String, Object> redisTemplate;

    private String readFromCache(String bucket, String key) {
            Object object = redisTemplate.opsForHash().get(bucketName, key);
            System.out.println("----" + redisTemplate.opsForHash().get("1", "1"));
            String returnValue = "";
            if (Objects.nonNull(object))
                returnValue = object.toString();
            return returnValue;
        }
    }

Class B

    Class B extends A{
       
    someMethod(){
       readFromCache(bucketName , key);
      }
    }

现在,当我为 class B 中的方法编写测试时,即 someMethod()。

     @RunWith(SpringJUnit4ClassRunner.class)
            @SpringBootTest
            @ActiveProfiles("test")
            ClassBTest(){

            @InjectMocks
Class B
            
            @Mock
            @Qualifier("redisTemplate")
            RedisTemplate<String, Object> redisTemplate;
            
            @Mock
            HashOperations<String, Object, Object> hashOpertaions;
              
    @Test
               someMethodTest(){
             Mockito.when(redisTemplate.opsForHash()).thenReturn(hashOpertaions);
                Mockito.doReturn("aa").when(hashOpertaions).get(Mockito.any(), Mockito.any());
    someMethod();
    //assertions
               
        }
            }

我观察到 redis 模板 mock 在测试 class 中生成,但在 Class A 和 class B

中没有生成

里面ClassBTest

里面classB

为什么模拟在 class B 和 A 中不起作用?

您没有将模拟注入到您正在测试的服务中。可以在要测试的 类 之前使用 @InjectMocks 来完成。你可以试试:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
@ActiveProfiles("test")
ClassBTest(){

    @Mock
    RedisTemplate<String, Object> redisTemplate;
    
    @Mock
    HashOperations<String, Object, Object> hashOpertaions;

    @InjectMocks
    B objectOfB;  // this would inject the created mocks into the class
      
    @Test
    someMethodTest(){
        Mockito.when(redisTemplate.opsForHash()).thenReturn(hashOpertaions);
        Mockito.doReturn("aa").when(hashOpertaions).get(Mockito.any(), Mockito.any());
        objectOfB.someMethod();
        //assertions
       
   }
}

我的问题现在已经解决了。这对我有用

@MockBean
    @Qualifier("redisTemplate")
    RedisTemplate<String, Object> redisTemplate;

    @MockBean
    HashOperations<String, Object, Object> hashOpertaions;

    @MockBean
    RedisKeyValueAdapter redisKeyValueAdapter;