Внедрение Spring Cloud Gateway в модульных тестах не работает

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

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" />

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

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

аутентификационный фильтр-тест-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-шлюз-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 to start reactive web server

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
1 365
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Другие вопросы по теме