Jedisライブラリの助けを借りて、プロジェクトでRedisを使い始めました。すべて正常に機能していますが、継続的インテグレーションで回避したい機能テストでRedisを起動する必要があるという問題があります。これを行うための最良の方法は何ですか?
機能/統合テストのオプションは次のとおりです。
言及すべきことの1つは、統合テストが単体テストに取って代わるべきではないということです。単体テストがおそらく好まれるべきであり、より多くのケースをカバーできますが、統合テストは、アプリケーションのすべての部分がうまく連携していることを確認するためだけに使用できます。そして、これが多くの人々がオプションナンバーワンを選ぶ理由だと思います。
これは同様の質問です mongodbについて 答えには2番目のオプションで機能するプロジェクトへのリンクがあります(mongodbプロセスを制御します)プロジェクトページのいくつかの関連リンクをたどると、 と呼ばれるものもありますnosql-unit 。これはオプション3をカバーしようとしていると思います。私はそれを使用しませんでしたが、 redis にも何かがあるようです。
Java用の単純なredis埋め込みランナーを実装しました: https://github.com/kstyrc/embedded-redis
現在、redis 2.6.14 for * nixおよび https://github.com/MSOpenTech/redis forWindowsを使用しています。ただし、RedisServerクラスを利用して、独自の実行スクリプトを実行できます。
RedisConf(bind、slaveof、port、dbfilenameなど)をサポートするように実装を拡張する予定です。この後、mvndepsのclojarにjarをアップロードします。
nosql-unit を試してください。 Javaでのredisユニットテストをサポートします。
EmbeddedRedisを試しましたが、多くのJedisインターフェースがサポートされていないことがわかりました。したがって、特に「パイプライン」などの高度なredis関数を使用している場合は、EmbbededRedisを使用することはお勧めできません。
単体テストにはManagedRedisを使用することをお勧めします。
コマンドラインredis-server --port 7777
を使用して、任意のポートでRedisサーバーを起動できます。したがって、統合テストの目的で、使用可能な(またはランダムな)ポートでRedisを開始し、Jedisがそのポートを使用するように構成されていることを確認できます。
このようにして、同時に発生する他のテスト実行を含め、他のプロセスと競合しないことがわかっているRedisの「新しい」インスタンスを取得します。これは、統合テストのためにインメモリ/組み込みデータベースを実行するのと同じように考えることができます。
「正規化されたデータ」をRedisにプリロードするには、--dbfilename <file>
スイッチ:redis-server --port 7777 --dbfilename test.rdb
を使用します。
これと同じ問題を処理するためのより良い方法は、RedisTemplate
を処理するSpringサービスを作成することでした。その後、@MockBean
を使用してサービスをモックし、テスト中に実行されているRedisインスタンスの欠如を抽象化します。
例ごと:
@Service
class RedisService {
@Autowired
private RedisTemplate<String, SomeClass> redisTemplate;
SomeClass get(String key) {
return redisTemplate.opsForValue().get(key);
}
}
そして統合テストでは:
class IntegrationTest {
@MockBean
private RedisService redisService;
@Before
public void setup() {
SomeClass someClass= new SomeClass();
when(redisService.get(anyString())).thenReturn(someClass);
}
}
実際の代替手段がSpringチームによって「公式に」推奨されていないことを理解しているため、redisメモリデータベースソリューションを使用することに懐疑的です。
@ksytrcが 彼の答え で述べたように、私は基本的に彼のソリューションを使用しました。 このプロジェクト で動作していました。embedded-redis依存関係を追加する必要があります。
<dependency>
<groupId>com.github.kstyrc</groupId>
<artifactId>embedded-redis</artifactId>
<version>0.6</version>
<scope>test</scope>
</dependency>
次に、テストクラスでredisServerを定義します
RedisServer redisServer;
@Before
public void setUp() throws IOException {
redisServer = new RedisServer();
redisServer.start();
}
また、以下の資格情報を使用してapplication.yml
を定義します。
spring:
redis:
Host: localhost
port: 6379