4

u MultipartFormDataInputオブジェクトをパラメーターとして受け取り、そこから多くの情報を引き出すResteasyWebサービスメソッドがあります。このメソッドのjUnitテストを作成したいのですが、このオブジェクトを作成してダミーデータを挿入する方法が見つからないため、Webサービスメソッドを直接呼び出すことができます。サービスメソッドは、次のようなフォームからデータを抽出します...

@POST
@Path("/requestDeviceCode")
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Consumes("multipart/form-data")
public DeviceCodeModel requestDeviceCode(final MultipartFormDataInput inputMultipart) {

    // process the form data - only field in the form is the token
    Map<String, List<InputPart>> formData = null; // we'll put the form data in here
    formData = inputMultipart.getFormDataMap();

    String token = null;
    try {
        token = formData.get("Token").get(0).getBodyAsString();
        this._logger.debug("Pulled encrypted token out of input form, it's " + token);

それは問題なく動作しますが、parmとして'requestDeviceCode'に渡すオブジェクトを作成しようとすると、私は困惑します。私はこれのバリエーションを試しました...

        // create a multipartForm (input to the service POST) and add the "token" string to it
        MultipartFormDataOutput newForm = new MultipartFormDataOutput();
        newForm.addFormData("Token", encryptedXMLString, MediaType.APPLICATION_XML_TYPE);

        _service.requestDeviceCode((MultipartFormDataInput) newForm);

しかし、それはそれを行っていないだけです(この特定のエラーは、出力フォームを入力フォームにキャストできないことです)。新しいMultiPartFormDataInputを作成してデータを追加する方法を見つけることができませんでした。

誰かアドバイスはありますか?

4

2 に答える 2

3

MultipartFormDataInput を受け入れる RestEasy WebService のメソッドを単体テストしようとしたときに、同様の問題に遭遇しました。

あなたができることは、MultipartFormDataInputをモックして、受け取ると予想される各フォーム パラメーターに対してモックされたInputPartを持つ準備されたマップを返すことです。

考えられる解決策 (JUnit/Mockito を使用):

@Test
public void testService() {
    // given
    MultipartFormDataInput newForm = mock(MultipartFormDataInput.class);
    InputPart token = mock(InputPart.class);

    Map<String, List<InputPart>> paramsMap = new HashMap<>();
    paramsMap.put("Token", Arrays.asList(token));        

    when(newForm.getFormDataMap()).thenReturn(paramsMap);
    when(token.getBodyAsString()).thenReturn("expected token param body");
    // when
    DeviceCodeModel actual = _service.requestDeviceCode(newForm);
    // then
    // verifications and assertions go here
}
于 2015-03-06T20:27:44.130 に答える
0

統合テストはどうですか?
テストに埋め込まれたjettyまたはTomcatを起動し、RESTサービスを実行させます。HTTPクライアントとして、ApacheHttpComponentsクライアントを使用します。サンプルページのチュートリアルとMultiPartクライアントの例を参照してください

于 2013-02-21T18:41:31.997 に答える