【问题标题】:Mocking Using JMockit使用 JMockit 进行模拟
【发布时间】:2012-09-04 21:08:31
【问题描述】:

我需要在 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)            
}

【问题讨论】:

  • 你用 JMockit 试过什么了吗?我知道你最后一个基本相同的问题建议 JMockit,还有 Mockito 和 EasyMock。例子比比皆是——你尝试过什么?
  • 我已经对我的问题添加了一个编辑,显示了我编写的测试......由于我正在研究的模拟对象是 httpClient,你认为如果我使用 java 或用 groovy 编写测试用例

标签: java groovy junit grails-2.0 jmockit


【解决方案1】:

使用 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)
}

【讨论】:

  • 感谢您的回复。如何在我的 grails 项目中开始使用 Jmockit。我在 grails 插件管理器中检查了 Jmockit 插件,但没有找到。
  • 不知道 grails 插件架构是如何工作的。但是如果 jmockit 在测试工具之前位于类路径上,它可以检测带注释的类。 jmockit 专用列表可以成为更好的信息源
【解决方案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 放在正确的位置。

【讨论】:

  • 感谢您的回复。如何在我的 grails 项目中开始使用 Jmockit。我在 grails 插件管理器中检查了 Jmockit 插件,但没有找到。
  • 这就是为什么以与您在项目中相同的方式设置简单的 grails 项目最有用的原因。 JMockit 的一个棘手问题是类路径设置,特别是它需要在 JUnit 之前位于 CP 上。
【解决方案3】:

感谢您提出问题,使用 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 2013-11-24
    • 2016-05-26
    相关资源
    最近更新 更多