1

我正在尝试用 groovy 为用 java 编写的类编写一个测试用例。Java 类(名称:Helper)中有一个方法,其中获取 HttpClient 对象并在其上调用 executeMethod。我试图在常规测试用例中模拟这个 httpClient.executeMethod() ,但无法正确模拟它。

下面是Java类 //这个帮助类是一个java类

public class Helper{

public static message(final String serviceUrl){   
----------some code--------

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

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

}
}

到目前为止,我用 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

2 回答 2

0

出色地!很难测试静态方法,甚至更难测试局部变量,除非您将它们声明为属性。我对静态类的结论有时是关于设计的,因为您可以将该代码块放在其他地方并重用。无论如何,这是我在这种情况下使用存根、模拟和 MOP 进行测试的方法:

这是一个类似于您的类的 Java 类:

import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.util.Date;

public class Helper{

  public static String message(final String serviceUrl) throws ParseException{
    SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yy");
    Date d = formatter.parse(serviceUrl);
    String code = d.toString();
    return code;
  }
}

这是我的 GroovyTestCase:

import groovy.mock.interceptor.MockFor
import groovy.mock.interceptor.StubFor
import java.text.SimpleDateFormat

class TestHelper extends GroovyTestCase{

  void testSendMessageNoMock(){
    def h = new Helper().message("01-01-12")
    assertNotNull h
    println h
  }

  void testSendMessageWithStub(){
    def mock = new StubFor(SimpleDateFormat)
    mock.demand.parse(1..1) { String s -> 
      (new Date() + 1) 
    }
    mock.use {
      def h = new Helper().message("01-01-12")
      assertNotNull h
    }
  }

  void testSendMessageWithMock(){
    def mock = new MockFor(SimpleDateFormat)
    mock.demand.parse(1..1) { String s -> 
      (new Date() + 1) 
    }
    shouldFail(){
      mock.use {
        def h = new Helper().message("01-01-12")
        println h
      }  
    }
  }

  void testSendMessageWithMOP(){
    SimpleDateFormat.metaClass.parse = { String s -> 
      println "MOP"
      new Date() + 1 
    }
    def formatter = new SimpleDateFormat()
    println formatter.parse("hello world!")
    println " Exe: " +  new Helper().message("01-01-12")
  }
}

您的问题的答案可能是:因为是方法中的局部变量,而不是要测试的协作者。

问候

于 2012-08-28T22:02:32.203 回答
0

它不起作用,因为编译的 Java 类在构造HttpClient实例时未通过 Groovy 的元对象协议 (MOP),因此未实例化模拟对象。

由于HttpClient实例是线程安全的,我会考虑将其作为依赖项注入到类中,这样测试就可以简单地注入模拟。

于 2012-08-29T11:37:06.503 回答