web-dev-qa-db-ja.com

モックredisテンプレート

モック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"));   
    }    
}
8
lahirumw

次のように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());
}
4
张泽光

コンストラクターを介してredisTemplateを作成していますが、DIによって取得されませんでした。 @Spyアノテーションを使用してみてください:

@Spy
private RedisTemplate redisTemplate = new RedisTemplate();

これにより、DIはRedisTemplateのインスタンスを挿入できます。

1
MaximSadym

同様の課題に直面しましたが、簡単な方法で解決するために、 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>
1

さまざまなジェダイモックライブラリを試しましたが、プールされたリソースで動作するのはこれだけです。他のライブラリ、サーバーは起動せず、一部のライブラリではローカルRedisを起動して実行する必要がありました。これはjunitに最適です

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

0
webjockey