2016-06-01 11 views
0

spring-bootでアプリを構築しています。それはのように働いたユニットテストでRedisサーバーへの接続を防止する

spring.redis.host=localhost 
spring.redis.password=secret 
spring.redis.port=6379 

<dependency> 
    <groupId>org.springframework.session</groupId> 
    <artifactId>spring-session</artifactId> 
    <version>1.2.0.RELEASE</version> 
</dependency> 

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-redis</artifactId> 
</dependency> 

とapplication.propertiesでそれらの線:スティッキーセッション関連の問題を避けるために、私はpom.xmlでそれらの行を追加することにより、所定の位置にRedisのセッションストアを置きます魅力。私が注釈を使用しなくてもそれがうまくいったことに驚きました@EnableRedisHttpSession。始めに、私はそれが素晴らしく見つけました。

問題:実際のアプリケーション用のSpring構成と、単体テスト専用のSpring構成があります。 Redis接続は単体テスト環境では役に立たず、テスト環境にRedisサーバーをインストールしないとテストが失敗します。

私は最終的にMaven RedisをMaven依存関係としてインストールすることができますが、この無駄な接続を無効にする方法が見つかった場合は、より洗練されたものになります。

+1

春ブーツの 'SessionAutoConfiguration'がで蹴るあなたのアプリケーションでそれを除外することができます。 ( '@ SpringBootApplication'またはプロパティ)は、[here](https://github.com/pivotal-cla/blob/b35645d709fc4bae31b353eaddbd15374cf2570f/src/main/java/io/pivotal/cla/GithubClaApplication.java)を参照してください。 – mp911de

+0

@ mp911deこれを追加するのは、アプリケーションのconfとtest confの両方に適用する場合のみです。私が手動で '@ EnableRedisHttpSession'をアプリケーションのconfに追加するだけで、それはテスト設定によっても検出されます。あなたは、アプリケーションconf上で '@ EnableRedisHttpSession'を検出するためにテスト環境をどのように防ぐことができるか考えていますか? –

+0

'@Enable ...'アノテーションからの回復はありません。有効になっています。私はプロファイルがここであなたを助けることができると思う。 – mp911de

答えて

0

@Profile注釈でこれを行うことができます。あなたのredis構成をNOT単位テストプロファイルでのみ動作させることができます。

@Configuration 
@Profile("!" + Constants.SPRING_PROFILE_UNITTEST) 
public class RedisConfiguration { 
    @Bean 
    public RedisTemplate getRedisTemplate() {...} 
} 
0

私は@ConditionalOnPropertyを使用し、ユニットテスト(testing=true)を実行中にプロパティを設定しています。このRedisのユニットテストの問題を解決するために:このように。だから、私はセッションの設定のため、次のコードを使用しています:

@Configuration 
public class SessionConfig { 
    @ConditionalOnProperty(name = "testing", havingValue = "false", matchIfMissing = true) 
    @EnableRedisHttpSession 
    public static class RedisSessionConfig { 
    } 

    @ConditionalOnProperty(name = "testing", havingValue = "true") 
    @EnableSpringHttpSession 
    public static class MapSessionConfig { 
     @Bean 
     public SessionRepository<ExpiringSession> sessionRepository() { 
      return new MapSessionRepository(); 
     } 
    } 
} 

とユニットテストのために、次のコード:

@RunWith(SpringRunner.class) 
@TestPropertySource(properties = "testing=true") 
@SpringBootTest(classes = Application.class) 
public class MyTest { 
} 
関連する問題