2017-11-22 3 views
1

私はSpringとの統合テストを書いています。応答のjsonに必要なすべてのデータが含まれていることを確認します。Spring JsonPathには何らかの順序で例外が含まれています

@Test 
public void getAll() throws Exception { 
    String url = "/permissions/all"; 
    int size = 4; 
    try { 
     Set<String> permissions = RandomGenerator.randomStrings(size); 
     initDb(permissions); 
     mvc.perform(get(url).with(Users.PERMISSIONS_READ)) 
       .andExpect(jsonPath("$[?(@.name)].name", hasSize(size))) //ok 
       .andExpect(jsonPath("$[?(@.name)].name").value(containsInAnyOrder(permissions))); //exception 
    } finally { 
     dropDb(); 
    } 
} 

しかし、私はここで例外を取得しています::、私は知っている

[{ 
    "id": 1, 
    "name": "7df2fa88-b22f-4d33-91b2-f8b00813522f" 
}, { 
    "id": 2, 
    "name": "b0ce9e8a-8b62-41f4-91b9-d9cf6ff96675" 
}, { 
    "id": 3, 
    "name": "7ebe3a4f-7864-4ea5-92b3-a5ad6f44bf42" 
}, { 
    "id": 4, 
    "name": "17b61119-c48c-4dff-ac9c-047eb3efcc43" 
}] 

正常に動作し$[?(@.name)].nameそのセレクタを、そして:

java.lang.AssertionError: JSON path "$[?(@.name)].name" 

Expected: iterable over [<[b0ce9e8a-8b62-41f4-91b9-d9cf6ff96675, 7ebe3a4f-7864-4ea5-92b3-a5ad6f44bf42, 7df2fa88-b22f-4d33-91b2-f8b00813522f, 17b61119-c48c-4dff-ac9c-047eb3efcc43]>] in any order 
but: Not matched: "7df2fa88-b22f-4d33-91b2-f8b00813522f" 

そして、この応答からのデータを、コードを参照してください。次の結果を返します。

[ 
    "7df2fa88-b22f-4d33-91b2-f8b00813522f", 
    "b0ce9e8a-8b62-41f4-91b9-d9cf6ff96675", 
    "7ebe3a4f-7864-4ea5-92b3-a5ad6f44bf42", 
    "17b61119-c48c-4dff-ac9c-047eb3efcc43" 
] 

permissionsも正しく設定されており、上記のサンプルのように4つの文字列が含まれています。

私がここで間違っていることを誰かに教えてもらえますか?

答えて

2

これは動作します:

Set<String> permissions = RandomGenerator.randomStrings(size); 
initDb(permissions); 
mvc.perform(get(url).with(Users.PERMISSIONS_READ)) 
    .andExpect(jsonPath("$[?(@.name)].name", hasSize(size))) //ok 
    .andExpect(jsonPath("$[?(@.name)].name").value(containsInAnyOrder(permissions.toArray(new String[permissions.size()])))); 

または修正再表示:

String[] permissions = RandomGenerator.randomStrings(size); 
initDb(permissions); 
mvc.perform(get(url).with(Users.PERMISSIONS_READ)) 
    .andExpect(jsonPath("$[?(@.name)].name", hasSize(size))) //ok 
    .andExpect(jsonPath("$[?(@.name)].name").value(containsInAnyOrder(permissions))); 

はここcontainsInAnyOrderの署名です:

public static <T> Matcher<Iterable<? extends T>> containsInAnyOrder(T... items) 

だから、それは同じタイプの可変引数を期待しますあなたが主張していること。あなたのケースでは、タイプStringに対してアサートしていますが、Set<String>containsInAnyOrderに指定すると、文字列とセットの一致が失敗します。

+0

ありがとうございました!はい、それは動作します –

関連する問題