【问题标题】:Unit tests in Groovy for Java code - how to mock java classes?用于 Java 代码的 Groovy 中的单元测试 - 如何模拟 Java 类?
【发布时间】:2011-03-09 21:13:23
【问题描述】:

我在一个用 Java 编写的大型项目中介绍 Groovy,开始(和大多数人一样)在 Groovy 中为 Java 类编写单元测试。

所以我遇到的问题是:

假设我有 2 个 Java 类,ClassA 和 ClassB,以这种方式交互:

public class ClassA {
  public void doSomething(...) {

    ...//something

    ClassB.invokeSomeStaticMethod((someParam);

    ...//something

  }
}

ClassB 是从数据库中查找一些数据的服务。我正在测试 ClassA 功能。所以我想以某种方式模拟 ClassB,所以在我的单元测试的上下文中它是 invokeSomeStaticMethod() 将返回模拟值进行测试。据我了解,这里的主要问题是这两个类都是 Java,因此 ClassB.invoke... 方法不是通过 Groovy MOP 路由的,Groovy Mocks 是基于它的。我对吗?我怎样才能达到我的需要?

谢谢! 米哈伊尔

【问题讨论】:

    标签: unit-testing groovy mocking mop


    【解决方案1】:

    静态方法,如单例,是可测试性的死亡。虽然在像 Groovy 这样的动态语言中这种情况要少一些,但在这里,您肯定遇到了一个经典的可测试性问题。

    解决办法是把你的依赖外化,把ClassB中的静态方法去掉

    public class ClassA(ClassB classB)
    {
        ClassB classB
        public void doSomething()
        {
             classB.invokeSomething();
        }
    }
    

    这种方法有两个好处:

    • ClassA 不再与 ClassB 紧密耦合。它可以替换为子类或模拟。
    • ClassA 现在宣传它对 ClassB 的依赖让全世界都知道,而不是依靠运行时错误让开发人员知道缺少某些东西。

    出色的文章 Singletons are Liars(来自 Google 测试博客)在探索这一概念方面做得非常出色。

    【讨论】:

    • 你说的是对的,但我现在不能改变那些只是类......这是个问题
    【解决方案2】:

    AFAIK,Groovy MOP 将无法替换对 ClassB.invokeSomeStaticMethod(someParam) 的调用。您可以使用 JMockit 之类的框架来帮助您模拟静态方法。

    【讨论】:

      【解决方案3】:

      好吧,我虽然元编程可能会有所帮助,但是一旦从 Java 代码调用 ClassB,它的元类就不起作用了。

      Mock static method with no parameters in Groovy

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多