Можно ли настроить обнаружение компонентов для @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.**
.