1

我在一个用 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 是基于它的。我对吗?我怎样才能达到我所需要的?

谢谢!米哈伊尔

4

3 回答 3

1

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

解决方案是将您的依赖关系外部化,并从中删除静态方法ClassB

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

这种方法有两个好处:

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

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

于 2011-03-09T21:51:44.600 回答
0

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

于 2011-03-09T21:51:17.577 回答
0

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

Groovy 中没有参数的模拟静态方法

于 2011-03-10T04:52:10.643 回答