【问题标题】:Testing with CDI, mocking a bean使用 CDI 进行测试,模拟 bean
【发布时间】:2013-05-24 08:37:50
【问题描述】:

我想知道如何使用 CDI 进行测试。并在注入期间模拟类。

如果我有课:

@Named
@RequestScoped
public class ItemProcessor {

  @Inject
  private ItemDao itemDao;


  public void execute() {


    List<Item> items = itemDao.fetchItems();
    for (Item item : items) {
        System.out.println("Found item " + item);
    }
  }
}

如果我想在测试期间模拟 ItemDao 类,当我想测试 My ItemProcessor 时该怎么办?

【问题讨论】:

    标签: java java-ee-6 cdi jboss-weld weld


    【解决方案1】:

    框架,如 mockito,即使在使用字段注入时也可以将依赖项设置为 mock:http://docs.mockito.googlecode.com/hg/latest/org/mockito/InjectMocks.html

    然而,一般来说,构造函数注入是首选的确切原因:可测试性。

    【讨论】:

    • 感谢您的帮助,但在哪里寻找 Csaba awnsered 的更多内容。
    • 我认为您对构造函数注入的评论是这个答案的最佳部分。
    【解决方案2】:

    您可以 - 例如 - 使用 CDI“替代品”。

    @Alternative
    public class TestCoderImpl implements Coder { ... }
    

    现在,只有在 beans.xml 中声明了这个 bean 作为替代时才会使用它。

    <alternatives>
        <class>package.TestCoderImpl</class>
    </alternatives>
    

    进一步info。

    【讨论】:

    • 我可以在没有@Alternative 注释的情况下使用我的普通bean 并在测试期间执行 吗?
    • 当然,你的普通 bean 不会有 @Alternative 注释,你的测试 bean 会有它。您可以通过在 beans.xml 中放置提到的标签来激活您的替代 bean。
    • 非常感谢您的帮助:)
    • 是否可以仅在 @Produce 方法上做同样的事情?
    • 好吧,您可以根据条件在您的生产者方法中创建一个 bean,请参阅here。或者,有更高级的解决方案here。
    猜你喜欢
    • 2015-09-20
    • 2013-11-02
    • 2011-05-15
    • 1970-01-01
    • 2019-01-04
    • 2013-08-05
    • 2018-02-03
    • 2019-09-01
    • 2015-07-16
    相关资源
    最近更新 更多