2017-01-24 42 views
2

我正在使用redis的spring會話,但我想在執行測試時禁用它。我的類註釋:在集成測試中禁用與redis的彈簧會話

@ActiveProfiles("integrationtests") 

和我的應用程序integrationtests.tml文件包含:

spring.autoconfigure.exclude: org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration 

,但它仍然失敗:

Caused by: org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool 

,如果我把測試工作的Redis服務器但是當然我不想保持這種方式; )

// 更新

我一直都試圖與

@SpringBootTest(classes = {Application.class}) 
@ActiveProfiles("integrationtests") 

和Application.class與排除的Redis:

@SpringBootApplication(exclude={SessionAutoConfiguration.class, RedisAutoConfiguration.class, RedisHttpSessionConfiguration.class}) 
public class Application { 

public static void main(String[] args) throws Exception { 
    SpringApplication.run(Application.class, args); 
} 
} 

,但它失敗:

Error creating bean with name 'redisMessageListenerContainer' defined in class path resource [org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfiguration.class] 

彈簧自動配置調試看到伊夫排除這個類,但它沒有任何效果:

Exclusions: 
----------- 

org.springframework.boot.autoconfigure.session.SessionAutoConfiguration 

org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration 

org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration 
+0

IVe的解決辦法在這裏它:http://stackoverflow.com/questions/ 33008798/spring-session-with-redis-how-to-mock-it-in-integration-tests/36203419#36203419,但主要問題依然存在 - 爲什麼排除redis類不排除它們? :) – freakman

+0

因爲知道在測試過程中總是有一個redis實例很難做準備,所以我建議你爲你的測試用例使用'spring.session.store-type = hash_map'屬性 – imarchuang

回答

0

沒有直接的解決方案,但肯定有一個變通,說下面Test類:

@SpringBootTest(classes = { ApplicationConfig.class }) 
@RunWith(SpringJUnit4ClassRunner.class) 
@ActiveProfiles("integrationtests") 
public class SpringBootRedisApplicationTest { 

    @Autowired 
    private StudentRepository studentRepository; 

    @Test 
    public void test() { 
    } 

} 

您可以創建基類的所有配置,如:

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages = { "com.spring.boot.redis.repository" }) 
public class ApplicationConfig { 

    @Bean 
    public JedisConnectionFactory jedisConnFactory() { 
     JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(); 
     jedisConnectionFactory.setUsePool(true); 
     jedisConnectionFactory.setHostName("localhost"); 
     jedisConnectionFactory.setPort(6379); 
     return jedisConnectionFactory; 
    } 

    @SuppressWarnings("rawtypes") 
    @Bean 
    public RedisTemplate redisTemplate() { 
     RedisTemplate redisTemplate = new RedisTemplate(); 
     redisTemplate.setConnectionFactory(jedisConnFactory()); 
     return redisTemplate; 
    } 

    @Bean 
    public RedisHttpSessionConfiguration redisHttpSessionConfiguration() { 
     return new RedisHttpSessionConfiguration(); 
    } 
} 

而子類集成測試,沒有@EnableRedisHttpSession

@Configuration 
@Profile({ "integrationtests", "unittest" }) 
public class IntegrationTestConfig extends ApplicationConfig { 

} 

,另一個@EnableRedisHttpSession所有其他配置文件一樣開發,分期和生產線,類似於下開發:

@Profile({ "dev" }) 
@Configuration 
@EnableRedisHttpSession 
public class DevConfig extends ApplicationConfig { 

} 

可選,可以使開發作爲春季啓動應用程序的默認配置文件中指定的application.propertiesspring.profiles.active,如:

spring.profiles.active=dev 

對於樣品例如,可以參考arpitaggarwal/spring-boot-redis

+0

明天我會試試更多的信息在我的評論(最後一篇)中:https://github.com/spring-projects/spring-session/issues/332 - 即使RedisHttpSessionConfiguration被添加到排除的類中,它也會在這個類中正確地使用'UnsatisfiedDependencyException':/ – freakman

+0

nope ,它沒有幫助,ive添加@EnableAutoConfiguration(排除= {SessionAutoConfiguration.class,RedisAutoConfiguration.class,RedisHttpSessionConfiguration.class}) @ActiveProfiles(「integrationtests」) 它仍然失敗,現在:錯誤創建名爲' enableRedisKeyspaceNotificationsInitializer'在類路徑資源中定義[org/springframework/session/data /redis/config/annotation/web/http/RedisHttpSessionConfiguration.class]: – freakman

+0

@freakman檢查我的更新答案。 – Arpit

0

我使用來解決這個Redis的依賴性而測試是使用@ConditionalOnProperty註釋和設定測試時一個屬性(testing=true)的替代方法。

的用戶會話配置以下代碼:

@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 { 
}