【问题标题】:WeldSE with JUnit5 - Can't inject dependenciesWeldSE 与 JUnit5 - 无法注入依赖项
【发布时间】:2019-11-27 05:23:05
【问题描述】:

这是我的服务类:

@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?

【问题讨论】:

    标签: java-ee-8 weld-se weld-junit5


    【解决方案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 对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 2019-02-25
      • 2022-07-07
      • 2020-06-04
      • 2017-02-10
      • 2021-07-01
      相关资源
      最近更新 更多