WeldSE с JUnit5 - невозможно вставить зависимости
Это мой класс обслуживания:
@Path("/foo")
@RequestScoped
public class FooService {
@Inject @Log
Logger logger;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String ping() {
return "pong";
}
}
В том же модуле у меня есть класс util, который обеспечивает регистратор с использованием интерфейса Log с аннотацией @Qualifier
public class WebResources {
@Produces
@RequestScoped
public FacesContext produceFacesContext() {
return FacesContext.getCurrentInstance();
}
@Produces @Log
public Logger produceLog(InjectionPoint injectionPoint) {
return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName());
}
}
Затем я написал UnitTest, используя JUnit 5 + Weld SE
@EnableWeld
public class FooTest {
@WeldSetup
public WeldInitiator weld = WeldInitiator.from(FooService.class)
.activate(RequestScoped.class)
.build();
@Test
public void ping(FooService fooService) {
fooService.ping();
}
}
Это приводит к следующей ошибке:
org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type Logger with qualifiers @Log
at injection point [BackedAnnotatedField] @Inject @Log it.infocert.shop.rest.FooService.logger
at it.infocert.shop.rest.FooService.logger(FooService.java:0)
Как правильно добавить зависимость @Log в Weld SE в модульном тесте?
1 ответ
Проблема в том, что класс WebResources
Сварку неизвестно, как только он запускает контейнер для испытаний. Это работает так, что вы определяете, какие компоненты находятся в контейнере - вы можете добавлять классы, пакеты и так далее.
В вашем случае, этого должно быть достаточно, чтобы изменить WeldInitiator
создание как это:
@WeldSetup
public WeldInitiator weld = WeldInitiator.from(FooService.class, WebResources.class)
.activate(RequestScoped.class)
.build();
Обратите внимание, что есть разные способы запуска WeldInitiator
начиная от самого простого, такого, который вы используете, и заканчивая предоставлением полностью настроенного org.jboss.weld.environment.se.Weld
объект.