这是我的服务等级:
@Path("/foo")
@RequestScoped
public class FooService {
@Inject @Log
Logger logger;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String ping() {
return "pong";
}
}
在同一模块中,我有一个util类,该类使用带 @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编写了一个UnitTest
@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?
答案 0 :(得分:1)
问题在于,一旦启动测试容器,Weld不知道类WebResources
。它的工作方式是定义容器中包含哪些bean-您可以添加类,包等。
对于您来说,这样更改WeldInitiator
的创建就足够了:
@WeldSetup
public WeldInitiator weld = WeldInitiator.from(FooService.class, WebResources.class)
.activate(RequestScoped.class)
.build();
请注意,有多种方法可以启动WeldInitiator
,从最简单的方法到您使用的org.jboss.weld.environment.se.Weld
对象,一路提供您自己的rowCollection
对象。