首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Maven的项目,JBehave和Selenium初始化CDI失败

基于Maven的项目,JBehave和Selenium初始化CDI失败
EN

Stack Overflow用户
提问于 2017-09-04 18:02:59
回答 1查看 76关注 0票数 0

我需要为基于Maven应用程序编写基于JBehave的UAT。测试已执行,但@Injected类未初始化,则测试开始。

我像这样使用jbehave maven-plugin:

代码语言:javascript
复制
 <plugin>
        <groupId>org.jbehave</groupId>
        <artifactId>jbehave-maven-plugin</artifactId>
        <version>4.1.1</version>

        <executions>
            <execution>
                <id>unpack-view-resources</id>
                <phase>pre-integration-test</phase>
                <goals>
                    <goal>unpack-view-resources</goal>
                </goals>
            </execution>
            <execution>
                <id>embeddable-stories</id>
                <phase>integration-test</phase>
                <configuration>
                    <includes>
                        <include>**/*Stories.java</include>
                    </includes>
                    <ignoreFailureInStories>true</ignoreFailureInStories>
                    <ignoreFailureInView>true</ignoreFailureInView>
                </configuration>
                <goals>
                    <goal>run-stories-as-embeddables</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

当我在测试中使用CDI时,我需要初始化weld,所以它可以与测试一起工作。但是CDI的初始化没有发生,并且我得到了带有测试代码的NPE。

我声明了如下依赖关系:

代码语言:javascript
复制
<dependency>
  <groupId>org.jbehave</groupId>
  <artifactId>jbehave-weld</artifactId>
  <version>4.1</version>
  <exclusions>
    <exclusion>
      <groupId>javax.enterprise</groupId>
      <artifactId>cdi-api</artifactId>
    </exclusion>
    <exclusion>
      <groupId>org.jboss.weld.se</groupId>
      <artifactId>weld-se</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>org.jbehave</groupId>
  <artifactId>jbehave-core</artifactId>
  <version>4.1.1</version>
</dependency>
<dependency>
  <groupId>org.jbehave</groupId>
  <artifactId>jbehave-maven-plugin</artifactId>
  <version>4.1.1</version>
</dependency>
<dependency>
  <groupId>org.jboss.weld.se</groupId>
  <artifactId>weld-se</artifactId>
  <version>2.3.5.Final</version>
</dependency>
<dependency>
  <groupId>org.jboss.weld.se</groupId>
  <artifactId>weld-se-core</artifactId>
  <version>2.3.5.Final</version>
</dependency>
<dependency>
  <groupId>javax.enterprise</groupId>
  <artifactId>cdi-api</artifactId>
  <version>1.2</version>
</dependency>
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
</dependency>

要在测试开始之前初始化CDI,必须做些什么?

EN

回答 1

Stack Overflow用户

发布于 2017-09-05 04:06:51

首先,您使用的是“过时”版本的CDI。该规范有一个全新的版本,CDI 2.0。请随意使用它。已经完成了一个实现-- Weld version 3.0。作为替代,您可以使用ApacheCDI2.0,这是已经支持CDI2.0的OpenWebBeans的另一个实现。

不管怎样,回到你的问题上。你没有提到你要实现什么样的测试。如果您想使用依赖项注入进行测试,只需编写一个提供所有依赖项的JUnit运行器。有一个nice tutorial可以做到这一点。在该教程中,您可以看到以下代码片段:

代码语言:javascript
复制
package com.memorynotfound.cdi.test;

import org.junit.runners.BlockJUnit4ClassRunner;
import org.junit.runners.model.InitializationError;

public class WeldJUnit4Runner extends BlockJUnit4ClassRunner {

    public WeldJUnit4Runner(Class<Object> clazz) throws InitializationError {
        super(clazz);
    }

    @Override
    protected Object createTest() {
        final Class<?> test = getTestClass().getJavaClass();
        return WeldContext.INSTANCE.getBean(test);
    }
}

用@RunWith(WeldJUnit4Runner.class)注释你的测试,你就有了测试中的依赖注入功能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46034691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档