0

可能重复:
单元测试来自 Groovy 测试用例的 Java 类中的静态方法

我正在尝试使用 groovy 对 java 类进行单元测试,其中Helper有一个静态方法,在其中HttpClient获取并executeMethod调用它。为了对这个类进行单元测试,我试图httpClient.executeMethod()在 Groovy 测试用例中模拟它,但我无法正确模拟它。

下面是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)

    }   
}
4

1 回答 1

2

从 Java 类的静态方法中显式调用 HttpClient 构造函数的设计将很难模拟以进行测试。Grails 模拟工具没有帮助,因为它们只能模拟 Groovy 代码中的调用,而不是 Java。如果您的助手类是用 Groovy 编写的,那么您可能会有更多的运气。

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

于 2012-09-04T18:19:58.423 回答