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);

    }
}

junit を groovy で記述しようとしましたが、Java クラスには grrovy メタプログラミング手法が適用されないため、作成できませんでした。私の調査では、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 に答える