Внедрение Spring Cloud Gateway в модульных тестах не работает - PullRequest
0 голосов
/ 20 мая 2018

У меня есть глобальный фильтр с внедренным атрибутом.

public class AuthenticationGlobalFilter implements GlobalFilter, Ordered {

    @Autowired
    private Permission permission;

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        long serviceId = 0;

        try {
            ServerHttpRequest request = exchange.getRequest();
            HttpHeaders headers = request.getHeaders();

            String fromKey = headers.getFirst("x-api-key");
            String fromIp = headers.getFirst("x-forwarded-for");
            String fromSubject = headers.getFirst("******");

            URI rqUrl = request.getURI();
            String path = rqUrl.getPath();
            serviceId = Long.parseLong(path.split("/")[6]);
            permission.check(permission.identity(fromKey, fromSubject, fromIp), serviceId);

            return chain.filter(exchange);
        } catch (PermissionException e) {
            exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
        } catch (IllegalArgumentException e) {
            exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);
        } catch (Exception e) {
exchange.getResponse().setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR);
        }

        return Mono.empty();
    }
}

Инжекция работает отлично, когда я запускаю приложение

@EnableDiscoveryClient
@SpringBootApplication
@EnableConfigurationProperties(ApiGatewayProperties.class)
@Import({ PermitAllSecurityConfiguration.class, CustomAttributesConfiguration.class })
@ImportResource(value = { "classpath:datasource.xml", "classpath:api-gateway-unico-beans.xml" })
public class ApiGatewayUnicoApplication {
    public static void main(String[] args) {
        SpringApplication.run(ApiGatewayUnicoApplication.class, args);
    }
}

С этим файлом конфигурации:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:c="http://www.springframework.org/schema/c"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:cache="http://www.springframework.org/schema/cache"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans.xsd  
                        http://www.springframework.org/schema/cache 
                        http://www.springframework.org/schema/cache/spring-cache.xsd                                      
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context.xsd">


<cache:annotation-driven
    cache-manager="cacheManager" />

<context:annotation-config />
<context:component-scan
    base-package="*****.apigatewayunico" />

<bean
    class="*****.apigatewayunico.filters.AuthenticationGlobalFilter" />

<bean class="*****.apigatewayunico.Persistence"
    p:sql="SELECT rep.url FROM RestService rs, RestEndpoint rep WHERE rep.id = rs.endpoint_id AND rs.id = ? AND rs.available = true" />

<bean id="permission"
    class=*****.permission.Permission" />

Проблема заключается в том, что когда я выполняю модульный тест, свойство вводится в модульном тесте, а не в тестируемом фильтре, что приводит к ошибкам из-за невозможности найти компонент, который может удовлетворитьэта зависимость.

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = RANDOM_PORT)
@DirtiesContext
public class AuthenticationGlobalFilterIntegrationTests extends BaseWebClientTests {
    @Autowired
    private Permission permission;

    @Before
    public void setup() {
        super.setup();

        reset(permission);
        permission.check(null, 123456L);
    }

    @Test
    public void runSucessTest() {
        expectLastCall();
        replay(permission);

        testClient.get().uri("/status/200").exchange().expectStatus().isEqualTo(HttpStatus.OK);
    }

    @Test
    public void runPermissionExceptionTest() throws Exception {
        expectLastCall().andThrow(new PermissionException(""));
        replay(permission);

        testClient.get().uri("/status/200").exchange().expectStatus().isEqualTo(HttpStatus.FORBIDDEN);
    }

    @EnableAutoConfiguration
    @SpringBootConfiguration
    @Import(DefaultTestConfig.class)
    @ImportResource(value = "classpath:authentication-filter-test-beans.xml")
    public static class TestConfig {
    }
}

authentication-filter-test-beans.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:c="http://www.springframework.org/schema/c"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <import resource="classpath:api-gateway-unico-test-beans.xml" />

    <bean id="authenticationFilter"
        class="*****.apigatewayunico.filters.AuthenticationGlobalFilter">
    </bean>
</beans>

api-gateway-unico-test-beans.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:c="http://www.springframework.org/schema/c"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd"
    default-lazy-init="false">

    <bean id="mockSupport" class="org.easymock.EasyMockSupport" />

    <bean id="pp" factory-bean="mockSupport"
        factory-method="createNiceMock"
        c:_0="*****.permission.PermissionPersistence" />
    <bean id="permission" factory-bean="mockSupport"
        factory-method="createNiceMock"
        c:_0="*****.permission.Permission" />
    <bean id="jdbc" factory-bean="mockSupport"
        factory-method="createNiceMock"
        c:_0="org.springframework.jdbc.core.JdbcTemplate" />
    <bean id="descoveryClienteMock" factory-bean="mockSupport"
        factory-method="createNiceMock"
        c:_0="org.springframework.cloud.client.discovery.DiscoveryClient" />
    <bean id="serviceInstanceMock" factory-bean="mockSupport"
        factory-method="createNiceMock"
        c:_0="org.springframework.cloud.client.ServiceInstance" />
</beans>

Теперь, когда я пытаюсь добавить xml конфигурации модульного теста в аннотацию @ConextConfiguration в модульном тесте, я получаю тест, связанный с зависимостями Reactor!

org.springframework.context.ApplicationContextException: Unableзапустить реактивный веб-сервер

1 Ответ

0 голосов
/ 21 мая 2018

Решено аннотированием зависимости с помощью @ Lazy

...