Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用多条记录验证数组JSON响应_Java_Rest Assured - Fatal编程技术网

在Java中使用多条记录验证数组JSON响应

在Java中使用多条记录验证数组JSON响应,java,rest-assured,Java,Rest Assured,我们有API,它给出了以下响应 [ { "subject": "English", "Marks": "79" }, { "subject": "Maths", "Marks&qu

我们有API,它给出了以下响应

[
        {
            "subject": "English",            
            "Marks": "79"
        },
        {
           "subject": "Maths",            
            "Marks": "89"

        }
    ]
    
我们需要证实这一点 科目=英语,分数=79 科目=数学,成绩=89分

我们已经试过了,但没有成功

JSONArray jsonarray = new JSONArray(strindentify);
            for (int i = 0; i < jsonarray.length(); i++) {
                JSONObject jsonobject = jsonarray.getJSONObject(i);
                String type = jsonobject.getString("subject");
                Assert.assertEquals(type, "English");
                String value = jsonobject.getString("Marks");
                Assert.assertEquals(value, "79");
                System.out.println(" The Subject and Marks:-" +type +"and" +value );
            }
JSONArray JSONArray=新的JSONArray(strindentify);
for(int i=0;i

需要断言Subject=English然后Marks=79等

您的断言有问题。您必须将两个字符串传递给assertEquals

Assert.assertEquals(type, "English");

for循环在每次迭代中检查两个主题。相反,您将希望在每次迭代中获得“subject”和“marks”的单个值,并根据主题检查您的条件

例如:

JSONArray jsonarray = new JSONArray(strindentify);

Assert.assertEquals(2, jsonarray.length, "Expected exactly 2 entries in array"); //optional

for (int i = 0; i < jsonarray.length(); i++) {
    JSONObject jsonobject = jsonarray.getJSONObject(i);
    String type = jsonobject.getString("subject");
    String value = jsonobject.getString("Marks");
    System.out.println(" The Subject and Marks:-" +type +"and" +value );
    
    switch(type) {
         case "English": Assert.assertEquals(value, "79"); break;
         case "Maths": Assert.assertEquals(value, "89"); break;
         default: throw new RuntimeException("Unexpected subject"); //optional
    }
}
JSONArray JSONArray=新的JSONArray(strindentify);
Assert.assertEquals(2,jsonarray.length,“在数组中应该正好有2个条目”)//可选择的
for(int i=0;i
注意“//optional”行,如果数组中有多于或少于2个项目,或者遇到英语或数学以外的任何科目,则分别会导致测试失败。 请注意,如果数组包含2个条目,但都是英语或数学,则此操作不会失败

我使用了一个
开关
,它允许您轻松地添加其他主题/标记组合。if/else构造也同样有效。如果使用
开关
,请记住断开

@测试
@Test
public void test_validJson() {
    String input = "Your_string_json_here";
    JSONArray jsonarray = new JSONArray(input);
    Assert.assertNotNull(jsonarray);
    for (int i = 0; i < jsonarray.length(); i++) {
        JSONObject jsonobject = jsonarray.getJSONObject(i);
        Assert.assertNotNull(jsonobject);
        String subject = jsonobject.getString("subject");
        String value = jsonobject.getString("Marks");
        Assert.assertNotNull(subject);
        Assert.assertNotNull(value);
        switch(subject) {
            case "English" : 
                Assert.assertEquals(value, "79");
                break;
            case "Maths" :
                Assert.assertEquals(value, "89");
                break;
            default: 
            // Fail on unrecognized subject?
            throw new AssertionException();
        }
     }
}
公共无效测试_validJson(){ String input=“您的字符串在这里”; JSONArray JSONArray=新JSONArray(输入); Assert.assertNotNull(jsonarray); for(int i=0;i
请注意,如果缺少主题和/或值,此操作将失败,对于未知主题也将失败。这并不保证数组的长度或元素的顺序,例如英语必须是第一个数组项等。重复的受试者也不会不通过测试。这只是验证如果给定的受试者包括在响应中,那么他们各自的分数与给定的分数相同

根据你的喜好修改这个

编辑: 如果要仅验证所选主题,请执行以下操作:

List<String> knownSubjects = Arrays.asList("History", "Maths", "English", "whatever");
Assert.assertTrue(knownSubjects.contains(subject));
List knownsobjects=Arrays.asList(“历史”、“数学”、“英语”、“随便什么”);
Assert.assertTrue(knownsobjects.contains(subject));
如果要仅验证具有已知标记的已知主题:

Map<String, String> subjectMarks = new HashMap<>();
subjectMarks.put("English", "89");
subjectMarks.put("Maths", "79");
subjectMarks.put("Whatever", "10");

Assert.assertTrue(subjectMarks.keySet().contains(subject));
Assert.assertEquals(value, subjectMarks.get(subject));
Map subjectMarks=newhashmap();
主语标记。put(“英语”,“89”);
科目分数。把(“数学”,“79”);
主题标记。放上(“无论什么”,“10”);
Assert.assertTrue(subjectMarks.keySet().contains(subject));
Assert.assertEquals(value,subjectMarks.get(subject));

我相信你的意思是“需要声明,如果主题=英语,那么分数=79”。缺少的“if”是这里的关键字,因为要做到这一点,您需要在代码中使用
if
语句,而我没有看到这些语句。再试一次。在这个测试用例中,我们可以查看您的导入或
hasItem(String)
的来源吗?如果不知道
hasItem()
的来源,您就不能确定字符串没有作为参数传入。在您看来,
hasItem()
可能会返回字符串值。虽然最好是低效的,但这可能是有效的。但是类型是字符串变量。您必须检查2个字符串的相等性。是的,我同意,但是考虑下面的<代码>公共字符串HASTION(String输入){RetryIdv};}。这就是我说它效率低下的原因。这个例子在这种情况下是可行的(尽管有很多问题)。@Haris我们修改了脚本请检查如果主题不固定,那么切换语句将不起作用,假设主题添加为历史、科学、地理等。我们使用了if和else语句,但需要动态主题。我不确定我是否理解这个问题。如果你有一个应该被接受的科目列表,我已经修改了我的问题,以包括该测试用例。如果您想为该数组包括标记测试(给定主题具有给定标记),则需要使用不同的数据模型。