2012-02-07 20 views
1

我正在使用一些遗留代码,我需要测试一些昂贵的服务被调用(它使网络调用,发送电子邮件等)。在编译时嘲笑

通过使用的框架(jboss seam 2),我可以注入一个假的服务而不是原来的服务。看到这个问题:Mock @org.jboss.seam.annotations.in behaviour for unittest

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

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

回答

5

我不同意你链接到的问题的答案。单元测试应该独立于它应该工作的环境来测试这个类。依赖注入框架被精确地用来在单元测试中注入模拟依赖,而不需要任何复杂的环境来运行单元测试。

我不知道Seam,但它的文档说@In可以放在一个属性访问器上。我只想有这样被测类:

public class someBean implements Serializable { 
    private ApplicationBean applicationBean 

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

我只是调用制定者在单元测试中注入模拟。

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

+0

我同意,但我已经尝试过这种方法,注射没有工作。链接的问题/答案基于接缝参考。我会再试一次您的建议,也许我错过了一些小东西:) – dcernahoschi 2012-02-07 21:01:41

+0

这样的事情怎么会不起作用:'ApplicationBean mockApplicationBean = mock(ApplicationBean.class); SomeBean someBean = new SomeBean(); someBean.setApplicationBean(mockApplicationBean);'这是普通的Java。如果它不起作用,那么制定者有一个错误。这种方法完全没有使用Seam。 – 2012-02-07 21:07:22

+0

它似乎工作,没有例外,但它使用正常的类而不是模拟。 – dcernahoschi 2012-02-07 21:12:40

1

您需要一个具有相同名称但优先级较高的类。我已经做了大量的嘲笑。

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

编辑:血腥的错别字。