2011-03-09 61 views
1

我在用Java编写的大型项目引入Groovy中,开始(因为大多数人的一样)使用Groovy中写单元测试Java类。Groovy for Java代码中的单元测试 - 如何模拟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 Mock所基于的)进行路由。我对吗?我怎么能达到我需要的?

谢谢! Mikhail

回答

0

AFAIK,Groovy MOP将无法取代ClassB.invokeSomeStaticMethod(someParam)的呼叫。你可以使用像JMockit这样的框架来帮助你模拟静态方法。

1

静态方法,如单身,是死亡的可测性。虽然在Groovy这样的动态语言中,这是一个小问题,但在这里,您已经触及了经典的可测试性问题。

的解决方案是你的外部化依赖性,并且从ClassB

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

删除静态方法这种方法有两个benenfits:

  • ClassA被nolonger紧密耦合到ClassB。它可以替换为一个子类,或者一个模拟。
  • ClassA现在宣传它在ClassB依赖世界知道,而这依赖于运行时错误,让开发人员知道缺少的东西。

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

+0

你在说什么是正确的,但我现在不能改变那些刚才的类......这是一个问题 – Zorkus 2011-03-09 22:00:50