web-dev-qa-db-ja.com

外部REST API呼び出しのためのjUnitとMockitoを使用したユニットテスト

私はサービスクラスのSpringBoot Javaアプリケーションでユニットテストを構築しています。

サービスクラスは、JSON応答を返すREST APIサービスへの外部呼び出しを行います。Mockitoを使用してこの呼び出しをモックしています。モックサーバー応答にJSONをハードコーディングしています。

単体テストでJSONをハードコーディングするのは悪い習慣ですか? JSON構造が変更された場合、テストは失敗するはずです。これを行うためのより良いベストプラクティスはありますか?

以下のスニペットの例:

実際のコードは機能しています。簡潔にするためにこのスニペットを編集しただけなので、エラーが表示された場合はコメントを投稿してください:

    public class UserServiceTest extends TestCase {

    private static final String MOCK_URL = "baseUrl";
    private static final String DEFAULT_USER_ID = "353";

    UserService classUnderTest;
    ResponseEntity<Customer> mockResponseEntity;
    MockRestServiceServer mockServer;
    @Mock
    RestTemplate mockRestTemplate;

    public void setUp() throws Exception {
        super.setUp();

        classUnderTest = new UserRestService();
        mockRestTemplate = new RestTemplate();
        mockServer = MockRestServiceServer.createServer(mockRestTemplate);

        ReflectionTestUtils.setField(classUnderTest, "restTemplate",
                mockRestTemplate);
        ReflectionTestUtils.setField(classUnderTest, "userSvcUrl",
                MOCK_URL);
    }

    public void testGetUserById() throws Exception {

        mockServer.expect(requestTo(MOCK_URL + "/Users/" + DEFAULT_USER_ID)).andExpect(method(HttpMethod.GET))
                .andRespond(withSuccess(
                        "{\n" +
                                "    \"UserCredentials\": {\n" +
                                "        \"Password\": \"\",\n" +
                                "        \"PasswordNeedsUpdate\": false,\n" +
                                "        \"Security\": [\n" +
                                "            {\n" +
                                "                \"Answer\": \"\",\n" +
                                "                \"Question\": \"Why did the bicycle fall over?\"\n" +
                                "            }\n" +
                                "        ]\n" +
                                "}"
                        , MediaType.APPLICATION_JSON));


        Customer customer = classUnderTest.getUserById(DEFAULT_USER_ID);

        mockServer.verify();
        assertNotNull(customer);
        assertEquals(DEFAULT_USER_ID, customer.getId());
    }
}
8
anataliocs

私は現在あなたと同じ船に乗っており、私の理由は次のとおりです。ダミーのJSON応答を作成することは、オブジェクトをモックして_Mockito.when_を使用して制御するようなものです。内部解析を変更した場合、または異なる結果が予想される場合は、when().thenReturn()呼び出しで何かを変更する必要があります。これは、呼び出しが変更され、オブジェクト表現が変更されるJSON応答と同じです。

したがって、これは問題ないと思います。テストに関するさまざまな記事を読むREST API)、一般的なコンセンサスは、ダミーのJSON応答を作成することをお勧めします。ベストプラクティスは、(時々)実際のJSON応答をダウンロードして挿入することです。これはモックされた応答です。このようにして、テストを外部の関係者と最新の状態に保つことができ、テストはインターネット要求なしで実行できます。

要求に応じて編集:

7

考慮すべき別のアプローチに光を当てたいと思います。それは、JSONが表すオブジェクトのPOJO(データモデル、JavBeanなど)を作成し、GoogleのGsonなどのJSONシリアライザーを使用してJSONに変換することです。ストリング。

UserCredentials uc = new UserCredentials ();
//set the values
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(uc);
4
Jose Martinez