2017-12-08 26 views
0

UIに表示されるJSONオブジェクトを返すAPIがあります。オブジェクト内のフィールドの順序は、UIがフィールドをその順序で表示したいので重要です。オブジェクトのフィールドの順序が正しいことを確認するための単体テストを作成したいと思います。上記、明らかにフィールドの順序を見つけるためのJSONPath式のMatcher

.andExpect(jsonPath("$.data"), is("field1=value1, field2=value2") 

:春ブーツのMockMvcライブラリを使用して

{ 
    "data": { 
     "field1": "value1", 
     "field2": "value2" 
    } 
} 

が、私はフィールドが順番に戻って来ていることを検証するために、このような式を書きたい:私のAPIの応答は次のようになります動作しませんが、私はどのタイプのMatcherフィールドを順番に試して検証するのに使用すべきかわかりません。

答えて

0

フィールドの順序を比較するHamcrestマッチャーが見つかりませんでしたが、自分で作成するのは簡単です。 JSONパス式の結果はLinkedHashMapになりますので、LinkedHashMapを取り込み、指定されたオブジェクトと比較して順番に入力します。 Listのエントリにマップを変換し、Listequalsメソッドを使用すると、Listのトリックは順番にアイテムを比較します。

private class OrderedMapMatcher extends BaseMatcher<Map<String, String>> { 

    private LinkedHashMap<String, String> expected; 

    public OrderedMapMatcher(LinkedHashMap<String, String> expected) { 
     this.expected = expected; 
    } 

    @Override 
    public boolean matches(Object o) { 
     if (!(o instanceof LinkedHashMap)) { 
      return false; 
     } 
     LinkedHashMap actual = (LinkedHashMap) o; 
     List<Map.Entry<String, String>> expectedList = new ArrayList<>(expected.entrySet()); 
     List actualList = new ArrayList(actual.entrySet()); 
     return expectedList.equals(actualList); 
    } 

    @Override 
    public void describeTo(Description description) { 
     description.appendText(expected.toString()); 
    } 
} 

そして、ここでアサーションがどのように見えるかです::ここで

はマッチャがどのように見えるかだ

LinkedHashMap<String, String> expectedData = new LinkedHashMap<>(); 
expectedData.put("field1", "value1"); 
expectedData.put("field2", "value2"); 

// mockMvc ResultActions code would be here 
.andExpect(jsonPath("$.data", new OrderedMapMatcher(expectedData))); 
関連する問題