3

我需要在 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 编写 junit,但由于 groovy 元编程技术不适用于 java 类,所以无法这样做。在我的研究中,我发现 JMockit 是一个很好的框架,它还可以模拟使用新构造函数创建的对象。

有人可以告诉我如何在 java 或 groovy 中为上述类编写单元测试。

高级感谢

这是我到目前为止使用 jmockit 尝试过的测试用例,但不起作用..

void testSend(){

    def serviceUrl = properties.getProperty("PROP").toString()

    new Expectations(){
        {
            HttpClient httpClient=new HttpClient();
            httpClient.executeMethod(); returns null;
        }        
    };
    def responseXml = Helper.sendMessage(requestXml.toString(), serviceUrl)            
}
4

3 回答 3

2

您的测试用例的 java 版本如下所示:

@Test
public void testSend() throws IOException {

    final String serviceUrl = "http://google.com/";

    new Expectations(){
        // these bits are important as they tell Jmockit what classes to mock
        @Mocked HttpClient client ;
        @Mocked GetMethod method;

        {
            HttpClient httpClient= new HttpClient() ;
            HttpMethod method = new GetMethod(withEqual(serviceUrl));
            try {
                httpClient.executeMethod(method);
            } catch (IOException e) {
                // not going to happen
            }
            result = 200;
        }
    };
    // run the test and assert something
    Assert.assertEquals(200, Helper.message(serviceUrl));
}

这在github.com上可用,注意我使用 httpClient 3.1 来实现您的消息方法,我猜这不太正确,但应该足以回答这个问题。

如果您可以使用您的测试用例准备一个简单的 grails 项目,我相信我可以找出问题所在。

更新:我一直在本地玩玩具 grails 项目,但未能正确配置 jmockit。jmockit 的关键是确保它在类路径上的 junit 之前,但是由于 junit 是在 grails 中提供的,所以我无法找到将 jmockit 放在正确的位置。

于 2012-09-05T10:29:30.840 回答
2

使用 jmockit,您还可以模拟实例创建。我更喜欢略有不同的技术:

@Test    
public void testFoo(@Mocked final HttpClient client) {
       new Expectations() {{
              // expect instance creation and return mocked one
              new HttpClient(... );  returns(client)

              // expect invocations on this mocked instance
             client.invokeSomeMethid(); returns(something)
       }};


        helper.message(serviceUrl)
}
于 2012-09-05T10:39:25.833 回答
0

感谢您提出问题,使用 Spring-web-3.2.2(使用 httpclient-4.0.1),我的代码如下所示:

    new NonStrictExpectations(){
        @Mocked(methods={"executeMethod"})
        ClientHttpRequest mocked_req;
        @Mocked(methods={"getBody"})
        ClientHttpResponse mocked_res;
        {
            byte[] buf  = (
            "<example_xml><person><name>Johnson</name><age>20</age></person></example_xml>" 
            ).getBytes();

            mocked_req.execute();
            mocked_res.getBody(); returns(new ByteArrayInputStream(buf));

        }
    };


    RestTemplate mytemplate = new RestTemplate();
    obj =         mytemplate.getForObject(.....);
    assertEquals("returned and parsed obj should be equal to this one", expectedObj, obj);
于 2013-05-09T20:43:00.173 回答