Unit testing 如何使用Junit测试返回MongoClient的单例EJB?

Unit testing 如何使用Junit测试返回MongoClient的单例EJB?,unit-testing,jakarta-ee,junit,ejb,jboss-arquillian,Unit Testing,Jakarta Ee,Junit,Ejb,Jboss Arquillian,我必须使用JUnit测试一个返回MongoClient的简单单例EJB。 我想我可以试试阿奎利安 通过这段代码,我获得了一个Java.lang.AssertionError,因为EJB不是由容器注入的。我错在哪里 EJB类: @Stateless @Singleton @ConcurrencyManagement(ConcurrencyManagementType.CONTAINER) public class MongoClientProviderBean { private Lo

我必须使用JUnit测试一个返回MongoClient的简单单例EJB。 我想我可以试试阿奎利安

通过这段代码,我获得了一个Java.lang.AssertionError,因为EJB不是由容器注入的。我错在哪里

  • EJB类:

    @Stateless
    @Singleton
    @ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
    public class MongoClientProviderBean {
    
        private Logger logger = Logger.getLogger(MongoClientProviderBean.class);
        private MongoClient mongoClient = null;
    
        @Lock(LockType.READ)
        public MongoClient getMongoClient() {
            return mongoClient;
        }
    
        @PostConstruct
        public void init() {
            try {
                String address = "mongo-host";
                int port = 27017;
                //TODO: inject del indirizzo e porta
                mongoClient = new MongoClient(address, port);
                logger.info("Inizializzato mongoclient ("+address+", "+port+")");
            } catch (UnknownHostException e) {
                e.printStackTrace();
            }
        }
    
        @PreDestroy
        public void tearDown() {
            mongoClient.close();
            logger.info("Mongoclient chiuso");
        }
    }
    
  • 测试等级:

    @RunWith(Arquillian.class)
    public class MongoClientProviderBeanTest {
    
    private static final Logger logger = Logger.getLogger(MongoClientProviderBean.class);
    @EJB
    MongoClientProviderBean mongoClientProviderBean;
    @Deployment
    public static JavaArchive createDeployment() {
        return ShrinkWrap.create(JavaArchive.class, "test.jar")
                .addClasses(MongoClientProviderBean.class, MongoClient.class)
                .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
    }
    
    @Test
    public void getMongoClient() throws Exception {
        assertNotNull(mongoClientProviderBean);
        /*
        dummy test
         */
        mongoClientProviderBean.getMongoClient();
      }
    
    }
    
  • POM的一部分:

    [...]
    <dependencyManagement>
        <dependencies>
            <dependency>
            <groupId>org.jboss.arquillian</groupId>
                <artifactId>arquillian-bom</artifactId>
                <version>1.1.13.Final</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.jboss.arquillian.container</groupId>
            <artifactId>arquillian-weld-ee-embedded-1.1</artifactId>
            <version>1.0.0.CR9</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jboss.weld</groupId>
            <artifactId>weld-core</artifactId>
            <version>2.3.5.Final</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jboss.arquillian.junit</groupId>
            <artifactId>arquillian-junit-container</artifactId>
            <scope>test</scope>
        </dependency>
        [...]
    </dependencies>
    [...]
    

    JUnit无法启动容器。

    仅焊接无法注入EJB。也许您可以尝试使用扩展焊接,以便像普通bean一样注入EJB。

    焊接本身不会注入EJB。也许您可以尝试使用extends weld,以便像普通bean一样注入EJB。

    谢谢您的回复;)。也许我不明白这个库是如何工作的,但在这个例子中()EJB是用Weld注入的。这是怎么可能的?构建在Weld之上的EJB服务器通过注入特殊的扩展来扩展它。这些扩展允许it更改行为,以便使用TransactionManager,注入EJB。。。这就是焊接se不够的原因。遗憾的是,唯一的可嵌入EJB容器是TOME,它不是基于Weld的。我的目标是,提供一些功能测试,而不必启动ejb服务器,使用其复杂的配置、数百个线程、复杂的数据源和jms定义。所示项目中还有一个示例:。但是网上还有很多其他的例子,如何在arquillian内部启动wildfly。这是不正确的。Weld ee embedded是一个支持EJB注入的容器。然而,我会选择Wildfly进行测试。@bartosz.majsak有趣的是,我确信,weld se本身并不支持它。我该如何激活它,因为我使用自己的扩展使它工作。通常情况下,带有EJB注释的字段保持为空。啊哈,我必须研究一下这个,焊接se和焊接…嵌入在这里是不同的,我认为不是这样。谢谢你的回复;)。也许我不明白这个库是如何工作的,但在这个例子中()EJB是用Weld注入的。这是怎么可能的?构建在Weld之上的EJB服务器通过注入特殊的扩展来扩展它。这些扩展允许it更改行为,以便使用TransactionManager,注入EJB。。。这就是焊接se不够的原因。遗憾的是,唯一的可嵌入EJB容器是TOME,它不是基于Weld的。我的目标是,提供一些功能测试,而不必启动ejb服务器,使用其复杂的配置、数百个线程、复杂的数据源和jms定义。所示项目中还有一个示例:。但是网上还有很多其他的例子,如何在arquillian内部启动wildfly。这是不正确的。Weld ee embedded是一个支持EJB注入的容器。然而,我会选择Wildfly进行测试。@bartosz.majsak有趣的是,我确信,weld se本身并不支持它。我该如何激活它,因为我使用自己的扩展使它工作。通常情况下,带有EJB注释的字段保持为空。啊哈,我必须研究一下这个,焊接se和焊接…嵌入在这里是不同的,我认为不是这样。感谢您对WildFly的stacktrace,它清楚地表明您的适配器配置错误-validateWildFlyDir失败,路径为
    null
    path。在您对WildFly的stacktrace中,它清楚地表明您对适配器配置错误-validateWildFlyDir失败,路径为
    null
    path。
    org.jboss.arquillian.container.spi.client.container.LifecycleException: Could not start container
    
    at org.jboss.as.arquillian.container.managed.ManagedDeployableContainer.startInternal(ManagedDeployableContainer.java:168)
    at org.jboss.as.arquillian.container.CommonDeployableContainer.start(CommonDeployableContainer.java:123)
    at org.jboss.arquillian.container.impl.ContainerImpl.start(ContainerImpl.java:199)
    [...]Caused by: java.lang.IllegalArgumentException: WFLYLNCHR0001: The path 'null' does not exist
    at org.wildfly.core.launcher.Environment.validateWildFlyDir(Environment.java:313)
    at org.wildfly.core.launcher.AbstractCommandBuilder.validateWildFlyDir(AbstractCommandBuilder.java:652)