jakarta-ee - 如何在 JUnit 测试中使用 HK2 注入(inject) CDI 事件?

标签 jakarta-ee glassfish payara hk2

我想使用简单的 JUnit Test(没有 arquillian,没有 MicroShed)来测试我的 Jakarta 应用程序 (Payara)。

我使用 Hk2 的 ServiceLocator 来注入(inject)服务,它对我的​​ JPA 实体和服务运行良好。

private static ServiceLocator serviceLocator;

@BeforeAll
public static void setUpBeforeClass() {
    serviceLocator = ServiceLocatorUtilities.createAndPopulateServiceLocator();
    ServiceLocatorUtilities.addClasses(
            serviceLocator,
            EntityManagerHK2Factory.class,
            ProducerUtils.class,
            FishService.class,
            ShopRepository.class,
            Family.class, Fish.class, FishStockKey.class, Shop.class, Stock.class, WaterType.class);
}

@Test
public void it_should_sell_fish() {
    //GIVEN
    FishService fishService = serviceLocator.getService(FishService.class);
    String shopName = "Magic Fish";
    String fishName = "Scalaire";
    int quantity = 3;
    //WHEN
    float bill = fishService.sell(shopName, fishName, quantity);
    //THEN
    assertThat(bill, is(54f));
}

但是由于我将 CDI 事件包含在 FishService 中,所以我遇到了一些问题。

@Inject
private Event<StockEvent> stockEvent;

然后我触发一个事件。

当我启动测试 serviceLocator 无法创建 FishService 时,出现以下错误:

A MultiException has 3 exceptions.  They are:
1. org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=Event<StockEvent>,parent=FishService,qualifiers={},position=-1,optional=false,self=false,unqualified=null,976949492)
2. java.lang.IllegalArgumentException: While attempting to resolve the dependencies of com.meynier.jakarta.service.FishService errors were found
3. java.lang.IllegalStateException: Unable to perform operation: resolve on com.meynier.jakarta.service.FishService

在此测试类中,我不想测试事件 CDI 功能。

如何使用 HK2 注入(inject) CDI 事件服务? (我的代码托管在这个 github account )

最佳答案

您可以使用Mockito模拟 Event,然后将模拟与 AbstractBinder 绑定(bind),并将其添加到 ServiceLocator。这是一个完整的测试

import javax.inject.Inject;

import org.glassfish.hk2.api.ServiceLocator;
import org.glassfish.hk2.api.TypeLiteral;
import org.glassfish.hk2.utilities.Binder;
import org.glassfish.hk2.utilities.ServiceLocatorUtilities;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.junit.BeforeClass;
import org.junit.Test;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public class Hk2CdiInjectTest {

    public interface Event<T> {
        T get();
    }

    public interface StockEvent {
        String getStock();
    }

    public static class Service {

        @Inject
        private Event<StockEvent> event;

        public String getStock() {
            return event.get().getStock();
        }
    }

    private static ServiceLocator locator;

    @BeforeClass
    public static void setUpBeforeClass() {
        locator = ServiceLocatorUtilities.createAndPopulateServiceLocator();
        ServiceLocatorUtilities.addClasses(locator, Service.class);

        final Event<StockEvent> event = (Event<StockEvent>) mock(Event.class);
        final StockEvent stockEvent = mock(StockEvent.class);
        when(stockEvent.getStock()).thenReturn("GOOGL UP!");
        when(event.get()).thenReturn(stockEvent);
        Binder eventBinder = new AbstractBinder() {
            @Override
            public void configure() {
                bind(event).to(new TypeLiteral<Event<StockEvent>>() {});
            }
        };
        ServiceLocatorUtilities.bind(locator, eventBinder);
    }

    @Test
    public void testIt() {
        Service service = locator.getService(Service.class);

        assertThat(service.getStock()).isEqualTo("GOOGL UP!");
    }
}

关于jakarta-ee - 如何在 JUnit 测试中使用 HK2 注入(inject) CDI 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60173575/

相关文章:

java - 是否可以将一个 Java EE 应用程序(war 文件)包含/嵌入到另一个应用程序中?

spring-mvc - 在DispatcherServlet中找不到HTTP请求的映射

在 header 中找不到 Spring Boot 安全性 x-auth-token

jakarta-ee - NetBeans 中 Java EE 项目的默认 index.jsp 文件在哪里?

Java Web 开发说明

java - 安装 Java EE 6 SDK

java - Jelastic Glassfish Mysql 字符设置

java - 如何通过 Payara5 在 Web 应用程序上显示数据库触发错误

java - 在 glassfish 服务器中运行项目时出现 web.xml SAXParseException 错误

maven - 启动payara 5 遇到过