モック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"));
}
}
次のように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());
}
コンストラクターを介してredisTemplateを作成していますが、DIによって取得されませんでした。 @Spyアノテーションを使用してみてください:
@Spy
private RedisTemplate redisTemplate = new RedisTemplate();
これにより、DIはRedisTemplateのインスタンスを挿入できます。
同様の課題に直面しましたが、簡単な方法で解決するために、 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>
さまざまなジェダイモックライブラリを試しましたが、プールされたリソースで動作するのはこれだけです。他のライブラリ、サーバーは起動せず、一部のライブラリではローカルRedisを起動して実行する必要がありました。これはjunitに最適です