【问题标题】:Inject CDI bean in a Junit test script在 Junit 测试脚本中注入 CDI bean
【发布时间】:2014-02-28 19:14:45
【问题描述】:

我有一个在 JBoss AS 7.1.1 上运行的应用程序。这个应用程序使用了一些CDI规范的资源作为拦截器、注入等。我的应用程序的架构非常简单,结构如下:

视图(xhtml 和 facelets)

控制器(带有@Named 的托管bean,ViewScoped 除外)

model(分为服务和dao两层)

服务(带有@Stateless注解,这里我使用我创建的拦截器来管理与数据库的事务,因为我使用的是原生JDBC)

我需要创建一些脚本来测试应用服务层,注入服务实现和调用业务方法。

我相信这种架构很常见。对不起我的英语。

有人可以帮帮我吗?

谢谢!

【问题讨论】:

    标签: junit jboss cdi


    【解决方案1】:

    如果您想测试您的完整容器,您可能需要Arquillian。如果您想使用模拟进行单元测试,请使用weld-se 在您的测试中启动一个独立的焊接容器。

    new Weld().initialize().instance().select(YourClassName.class).get();
    

    您可以使用 beans.xml 中的替代项来替换您的模拟对象。您也可以使用CDI-Unit,这会稍微简化流程。

    【讨论】:

    • 这个 CDI 单元有其他依赖库吗?我尝试使用它,但出现错误。您知道如何正确配置 CDI-Unit 吗?谢谢!
    • 我做了你推荐的 bblonski 但是出现这个错误:org.jboss.weld.context.ContextNotActiveException: WELD-001303: No active contexts for scope type javax.enterprise.context.RequestScoped at org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:680) at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:79) at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:99) at org.jboss.weld.proxies.CommonDataSource$DataSource$Wrapper$-896135856$Proxy$_$$_WeldClientProxy.getConnection(Unknown Source) more...
    • 您是否尝试过使用@InRequestScoped CDI-Unit 注释? jglue.org/cdi-unit-user-guide/#scopes 否则,如果您想从容器模拟完整的请求周期,您可能会在 Arquillian 上获得更好的运气。使用 CDI-Unit 测试低级库和实用方法,使用 Arquillian 测试用户请求和会话数据。
    • 所以...我尝试将 CDI-Unit 与 @InRequestScoped 注释一起使用,但没有奏效。 Arquillian 没有工作,因为我没有使用 Maven。我不知道我必须做什么。我要放弃了。我已经尝试了很多方法。我用weld-se 做了一个JUnit 类,并让它在我的测试脚本中注入一个业务组件。但是,在调用业务方法时,会出现 WELD-001303 错误。非常感谢!
    • 我发现了一个使用 Arquillian 和 ant 或 gradle 的示例 github.com/mojavelinux/arquillian-showcase/tree/master/cdi。这里还有一些关于将 Arquillian 与其他构建系统集成的注意事项。 docs.jboss.org/arquillian/reference/snapshot/en-US/html/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 2014-06-02
    • 1970-01-01
    相关资源
    最近更新 更多