簡體   English   中英

如何消除在 Spring Boot 單元測試中啟用安全性的 @Configuration 類

[英]How to eliminate @Configuration classes with security enabled in Spring Boot unit testing

我在一個新的微服務上運行良好,所有測試用例也運行良好。 最近,Spring Boot 微服務啟用了 spring security with sso。 微服務運行良好,但由於安全原因,測試用例失敗了。 我有一個需要在 Spring Boot 單元測試期間在運行時消除的類。 我在代碼下方提供。

@Configuration
@Slf4j
public class CloudSecurityConfig {
    private String host = "some host";
    private String port = System.getenv("redis.port");
    private String password = System.getenv("redis.password");
    private String ssl = System.getenv("redis.ssl");
    
    @Bean
    JedisPoolConfig jedisPoolConfig(@Value("${redis.pool.maxactive}") int maxActive,
            @Value("${redis.pool.maxidle}") int maxIdle, @Value("${redis.pool.minidle}") int minIdle) {
        .... Other code
        return jedisPoolConfig;
    }
    
    @Bean
    JedisConnectionFactory jedisConnectionFactory() throws Exception {
            .... Other code
        
        return jedisConFactory;
    }

    @Bean
    @Primary
    public RedisTemplate<String, CtmUser> redisTemplate() throws Exception {
        .... Other code
        return redisTemplate;
    }
}

我也嘗試過這個鏈接Java Spring Boot Test: How to exclude java configuration class from test context 但它不起作用。 我收到以下錯誤詳細信息。

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.data.redis.core.RedisTemplate<?, ?>' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1717) ~[spring-beans-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1273) ~[spring-beans-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1227) ~[spring-beans-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640) ~[spring-beans-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    ... 84 common frames omitted

以上來自CloudSecurityConfig類。 我想,如果我能夠刪除這個配置,一切都會正常的。

上面的錯誤后面跟着下面的錯誤:

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'customAuthenticationProvider': Unsatisfied dependency expressed through field 'template'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.data.redis.core.RedisTemplate<?, ?>' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

我嘗試了以下選項。

//@EnableMongoRepositories
@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration()
@SpringBootTest(classes = { ValidationApplication.class, TestMongoConfiguration.class })
//@ImportAutoConfiguration(classes = {ValidationApplication.class,TestMongoConfiguration.class})
//@EnableAutoConfiguration(exclude={ DataSourceAutoConfiguration.class, RedisAutoConfiguration.class,
//        RedisRepositoriesAutoConfiguration.class, MongoAutoConfiguration.class })

//@EnableAutoConfiguration(exclude={ DataSourceAutoConfiguration.class, RedisAutoConfiguration.class,
//      RedisRepositoriesAutoConfiguration.class, MongoAutoConfiguration.class, SecurityAutoConfiguration.class })

//@EnableAutoConfiguration(exclude={ CloudSecurityConfig.class })

//@TestPropertySource(inheritProperties = false, properties = 
//        "spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration")
//@TestConfiguration()
//@ConditionalOnProperty(name = "test", havingValue="test")
@ActiveProfiles("test")
@ComponentScan(basePackages = {"com.a.b.c.d"}
, excludeFilters = {
    @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = {SecurityCloudConfig.class})})
public class CheckTest {

    @Autowired
    private MyController controller;
    
    @Test
    void testAllBeforeEntry() {
        ResponseEntity<?> re = controller.getValdiations();
        boolean flag = re.getStatusCode().is2xxSuccessful();
        assertEquals(true, flag);
    }

}

與其忽略,不如覆蓋 configure 類。 您可以為測試環境編寫適當的 TestConfiguration 類。 這里添加了一個例子:


@TestConfiguration
public class TestSecurityConfig {

    @Bean
    @Primary
    JedisPoolConfig jedisPoolConfig(@Value("${redis.pool.maxactive}") int maxActive,
            @Value("${redis.pool.maxidle}") int maxIdle, @Value("${redis.pool.minidle}") int minIdle) {
          // your test environment specific code/configuration.
    }

    @Bean
    JedisConnectionFactory jedisConnectionFactory() throws Exception {
            .... Other code
        // test environment specific code.
    }
    // .... Other configurations which needs to be override.

    

注意:不要忘記在 test Beans 中添加@Primary並在 test application.properties 文件中添加@Primary spring.main.allow-bean-definition-overriding=true 並在主單元測試類中添加@SpringBootTest(classes = TestSecurityConfig.class)以覆蓋原始 Bean。

您也可以提供 MockBean 而不是真正的 MockBean。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM