带有 JUnit5 的 WeldSE - 无法注入依赖项
WeldSE with JUnit5 - Can't inject dependencies
这是我的服务class:
@Path("/foo")
@RequestScoped
public class FooService {
@Inject @Log
Logger logger;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String ping() {
return "pong";
}
}
在同一个模块中,我有一个实用程序 class,它使用带有 @Qualifier 注释
的 Log 接口提供记录器
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());
}
}
然后我使用 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?
问题是 class WebResources
一旦启动容器进行测试,Weld 就不知道了。它的工作方式是您定义容器中的 bean - 您可以添加 classes、包等。
在您的情况下,像这样更改 WeldInitiator
创建应该就足够了:
@WeldSetup
public WeldInitiator weld = WeldInitiator.from(FooService.class, WebResources.class)
.activate(RequestScoped.class)
.build();
请注意,启动 WeldInitiator
的方式多种多样,从最简单的方式(例如您使用的方式)到提供您自己的完全配置的 org.jboss.weld.environment.se.Weld
对象。
这是我的服务class:
@Path("/foo")
@RequestScoped
public class FooService {
@Inject @Log
Logger logger;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String ping() {
return "pong";
}
}
在同一个模块中,我有一个实用程序 class,它使用带有 @Qualifier 注释
的 Log 接口提供记录器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());
}
}
然后我使用 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?
问题是 class WebResources
一旦启动容器进行测试,Weld 就不知道了。它的工作方式是您定义容器中的 bean - 您可以添加 classes、包等。
在您的情况下,像这样更改 WeldInitiator
创建应该就足够了:
@WeldSetup
public WeldInitiator weld = WeldInitiator.from(FooService.class, WebResources.class)
.activate(RequestScoped.class)
.build();
请注意,启动 WeldInitiator
的方式多种多样,从最简单的方式(例如您使用的方式)到提供您自己的完全配置的 org.jboss.weld.environment.se.Weld
对象。