1

javaで書かれたクラスのテストケースをgroovyで書こうとしています。Java クラス (name: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

コンパイルされた Java クラスがHttpClientインスタンスを構築するときに Groovy のメタ オブジェクト プロトコル (MOP) を経由せず、モック オブジェクトがインスタンス化されないため、動作しません。

HttpClientインスタンスはスレッド セーフであるため、依存関係としてクラスに挿入することを検討します。そうすれば、テストで代わりにモックを簡単に挿入できます。

于 2012-08-29T11:37:06.503 に答える
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 に答える