2012-09-04 37 views
0

可能重复:
Unit Testing a static method in a Java Class from Groovy Test case惩戒的HttpClient在Groovy

我使用试图单元测试java类常规的Helper具有其中获得一个HttpClient在它的静态方法和executeMethod被调用。为了对这个类进行单元测试,我试图在Groovy测试用例中嘲笑这个httpClient.executeMethod(),但是我无法正确地嘲笑它。

下面是一个Java类

public class Helper{ 

    public static message(final String serviceUrl){ 

     HttpClient httpclient = new HttpClient(); 
     HttpMethod httpmethod = new HttpMethod(); 

     // the below is the line that iam trying to mock 
     String code = httpClient.executeMethod(method); 

    } 
} 

如何单元测试在Groovy这个静态方法什么想法?由于httpClient对象位于类方法内部,因此如何在Groovy测试用例中嘲笑此对象?

这是我迄今为止的测试案例。我试图嘲弄为空,但不会发生......

void testSendMessage(){ 
    def serviceUrl = properties.getProperty("ITEM").toString() 

    // mocking to return null 
    def mockJobServiceFactory = new MockFor(HttpClient) 
    mockJobServiceFactory.demand.executeMethod{ HttpMethod str -> 
     return null 
    } 

    mockJobServiceFactory.use {   
     def responseXml = helper.message(serviceUrl) 

    } 
} 
+0

也许[this](http://thecarlhall.wordpress.com/2010/03/25/unit-testing-with-httpclients-localtestserver/)可以帮助你。 –

回答

2

一个设计在那里你明确地从一个Java类的静态方法中调用HttpClient的构造将是非常困难的嘲笑为测试。 Grails嘲笑设施将无济于事,因为它们只能模拟Groovy代码中的调用,而不是Java。如果你的帮手类是用Groovy编写的,你可能会有更多的运气。

更好的设计是使用实例方法而不是静态的单例服务(或其他Spring bean),并使用某种依赖注入,或者是HttpClient实例或某种返回HttpClient的工厂对象。在测试中,您可以使用模拟工具替换该工厂。

+0

感谢您的回复伊恩。但上面的代码已经投入生产,因此无法改变。你认为用java编写这个java类的测试用例是一个更好的主意,而不是groovy。如果我正在使用Java编写测试用例,那么您能否建议我在那里嘲笑httpclient调用? – Npa

+0

您仍然可以在Groovy中编写测试,但您需要使用纯Java模拟库(如JMockit),而不是Grails提供的基于Groovy-metaclass的框架。 –

+0

我可以将JMOCKit添加到我的grails项目中。你可以让我看看使用JMockit实现的一些例子 – Npa