Можно ли настроить обнаружение компонентов для @QuarkusTest?

Рассмотрим следующее приложение Quarkus:

      @ApplicationScoped
@Path("/hello")
public class HelloService {

    @Inject
    Helper helper;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String sayHello(){
        return "Hello "+helper.getName();
    }
}


@Dependent
public class Helper {

    public String getName() {
        return "World";
    }
}

и следующий тест:

      @QuarkusTest
@TestHTTPEndpoint(HelloService.class)
public class HelloQuarkusTest {

    @Test
    void testSayHello(){
        given().when().then().body(is("Hello World"));
    }
}

Все в порядке до этого момента. Сервис и его помощник, конечно, немного сложнее, чем на самом деле. Поэтому я хочу провести несколько модульных тестов. Если я напишу модульный тест для службы следующим образом:

      @EnableAutoWeld
@ExtendWith(MockitoExtension.class)
class HelloUnitTest {

    @Inject
    HelloService helloService;

    @Produces @Mock
    @ExcludeBean // don't use the real bean, use this instead
    Helper helperMock;

    @Test
    void testSayHello(){
        when(helperMock.getName()).thenReturn("Mock");
        final String actual = helloService.sayHello();
        assertThat(actual).isEqualTo("Hello Mock");
    }
}

Затем юнит-тест становится зеленым, но вдруг он терпит неудачу, потому что он находит как настоящие, Helperреализации и поле производителя из модульного теста и, следовательно, выдает AmbiguousResolutionException:

      java.lang.RuntimeException: java.lang.RuntimeException: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
    [error]: Build step io.quarkus.arc.deployment.ArcProcessor#validate threw an exception: javax.enterprise.inject.spi.DeploymentException: javax.enterprise.inject.AmbiguousResolutionException: Ambiguous dependencies for type com.example.Helper and qualifiers [@Default]
    - java member: com.example.HelloService#helper
    - declared on CLASS bean [types=[com.example.HelloService, java.lang.Object], qualifiers=[@Default, @Any], target=com.example.HelloService]
    - available beans:
        - CLASS bean [types=[java.lang.Object, com.example.Helper], qualifiers=[@Default, @Any], target=com.example.Helper]
        - PRODUCER FIELD bean [types=[java.lang.Object, com.example.Helper], qualifiers=[@Default, @Any], target=com.example.Helper com.example.weld.HelloUnitTest.helperMock, declaringBean=com.example.weld.HelloUnitTest]

Это происходит, даже если тесты находятся в разных пакетах. В какой-то степени я понимаю, почему сканирование более одного класса/пакета предназначено для , но в данном случае мне это не нравится.

Итак, мой вопрос:

Как я могу настроить, какие bean-компоненты/классы/пакеты @QuarkusTestподхватывает, а какие игнорирует?

Я пробовал играть с настройками Arc в application-test.properties, но пока не нашел нужного сочетания свойств.

1 ответ

Вы можете попробовать добавить все модульные тесты для сварки в определенный пакет и исключить этот пакет из обнаружения кварка черезquarkus.arc.exclude-types; то есть что-то вроде%test.quarkus.arc.exclude-types=org.acme.unit.tests.**.

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