【问题标题】:Mocking at compile time在编译时模拟
【发布时间】:2012-02-29 04:54:11
【问题描述】:

我正在处理一些遗留代码,我需要测试是否调用了一些昂贵的服务(它进行网络调用、发送电子邮件等)。

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

我现在希望我的假对象是一个更智能的模拟来断言它是否被调用等等。我希望它是一个 Mockito 或 Easymock 或其他一些模拟。但是在测试中以经典方式构建模拟然后注入它,由于 seam 2 和 seam 测试处理注入的方式而无法正常工作。请参阅上面的链接。

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

【问题讨论】:

    标签: java mocking seam integration-testing mockito


    【解决方案1】:

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

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

    public class someBean implements Serializable {
        private ApplicationBean applicationBean
    
        @In
        protected void setApplicationBean(ApplicationBean applicationBean) {
            this.applicationBean = applicationBean;
        }
        ...
    }
    

    我只会调用 setter 在单元测试中注入模拟。

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

    【讨论】:

    • 我同意,但我已经尝试过这种方法,但注入不起作用。链接的问题/答案基于接缝参考。我会再试一次你的建议,也许我错过了一些小东西:)
    • 这样的事情怎么可能行不通:ApplicationBean mockApplicationBean = mock(ApplicationBean.class); SomeBean someBean = new SomeBean(); someBean.setApplicationBean(mockApplicationBean); 这是普通的旧 Java。如果它不起作用,那么设置器有一个错误。这种方法根本不使用 Seam。
    • 它似乎工作,没有例外,但它使用的是普通类而不是模拟。
    • 如果 ApplicationBean 是一个具体类,并且您没有将模拟配置为除了具体类所做的之外的任何事情,那么当然会使用真正的方法。使用前需要配置 mock:when(mockApplicationBean.someMethod()).thenReturn(5);
    • 我设法让它工作。 Seam 依赖在每个方法调用之前注入字段(我正在做集成测试)。所以在调用 action 方法之前做一个 setApplicationBean 是没有用的。但是在注入时,它会在其上下文(事件、请求、对话等)中搜索现有组件。解决方案是在对话上下文中用模拟组件替换真实组件。感谢 JB Nizet 让我走在正确的轨道上。
    【解决方案2】:

    您需要一个具有相同名称但优先级更高的类。我已经建立了很多模拟只是这样做。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-12
      • 1970-01-01
      • 2020-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多