在编译时嘲笑

时间:2012-02-07 18:28:25

标签: java mocking seam integration-testing mockito

我正在使用一些遗留代码,我需要测试一些昂贵的服务被调用(它会进行网络呼叫,发送电子邮件等)。

我可以通过使用的框架(jboss seam 2)注入假服务而不是原始服务。请参阅此问题:Mock @org.jboss.seam.annotations.in behaviour for unittest

我现在希望我的假对象是一个更聪明的模拟断言是否已被调用,等等。我希望它是一个Mockito或Easymock或其他一些模拟。但是,由于接缝2和接缝测试处理注射的方式,在测试中构建模拟经典方式然后注入它是不起作用的。请参阅上面的链接。

问题:有没有办法让我的模拟扩展或注释才能成为Mockito或模拟的东西?如何在测试中获得对它的引用?

2 个答案:

答案 0 :(得分:6)

我不同意你所关联的问题的答案。单元测试应该独立于它应该工作的环境测试该类。并且依赖注入框架正好用于能够在单元测试中注入模拟依赖项,而无需任何复杂的环境来运行单元测试。

我不知道Seam,但它的文档说@In可以放在属性访问器上。我会像这样测试这个课程:

public class someBean implements Serializable {
    private ApplicationBean applicationBean

    @In
    protected void setApplicationBean(ApplicationBean applicationBean) {
        this.applicationBean = applicationBean;
    }
    ...
}

我只想调用setter在单元测试中注入mock。

你也可以让代码保持原样,但提供一个setter或一个额外的构造函数,以便能够注入一个模拟的applicationBean。

答案 1 :(得分:2)

您需要一个名称相同但优先级更高的类。我做了很多嘲讽。

您为模拟类提供相同的@name,并定义@install(precedence = MOCK)。只要这个类在类路径中,它就会被用来代替你的普通类(如果我没记错的话,优先级默认是应用程序)。 我刚才没有准备好代码,但是我模拟了facesmessage,所以在测试期间,我可以从这个类中读取这些消息并验证它们。