WeldSE с JUnit5 — невозможно внедрить зависимости

Это мой класс обслуживания:

@Path("/foo")
@RequestScoped
public class FooService {

    @Inject @Log
    Logger logger;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String ping() {
        return "pong";
    }
}

В том же модуле у меня есть класс утилиты, который предоставляет регистратору использование интерфейса журнала с аннотацией @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 в модульном тесте?


person Fabrizio Stellato    schedule 18.07.2019    source источник


Ответы (1)


Проблема в том, что класс WebResources не известен Weld, когда он запускает контейнер для тестов. Это работает следующим образом: вы определяете, какие bean-компоненты находятся в контейнере — вы можете добавлять классы, пакеты и так далее.

В вашем случае должно быть достаточно изменить создание WeldInitiator следующим образом:

@WeldSetup
public WeldInitiator weld = WeldInitiator.from(FooService.class, WebResources.class)
        .activate(RequestScoped.class)
        .build();

Обратите внимание, что существуют различные способы запуска WeldInitiator, начиная от самого простого, такого как тот, который вы используете, и заканчивая созданием собственного полностью настроенного объекта org.jboss.weld.environment.se.Weld.

person Siliarus    schedule 19.07.2019