Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.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 Junit断言_Java_Junit - Fatal编程技术网

Java Junit断言

Java Junit断言,java,junit,Java,Junit,**我正在比较csv和db数据之间的两个列表,但我返回void,因此我的断言不起作用。断言将起作用的更改应该是什么。我尝试过将返回值放在匹配查找的下面,并将返回类型更改为布尔值,但它不起作用 public static boolean compareTwoLists(List<Map<String, String>> csvData, List<Map<String, String>> sqlData) { // Comparat

**我正在比较csv和db数据之间的两个列表,但我返回void,因此我的断言不起作用。断言将起作用的更改应该是什么。我尝试过将返回值放在匹配查找的下面,并将返回类型更改为布尔值,但它不起作用

        public static boolean compareTwoLists(List<Map<String, String>> csvData, List<Map<String, String>> sqlData) {

// Comparator on basis of product Code
        Comparator<Map<String, String>> comp = (o1, o2) -> {
            return o1.get("productcode").compareTo(o2.get("productcode"));
        };
         System.out.println("Test");
        Collections.sort(csvData, comp);

        Collections.sort(sqlData, comp);
        System.out.println("testdef");

        for (Map<String, String> i : sqlData) {
            if (csvData.contains(i)) {
                System.out.println("Match Found " + i);
                return true;
            }else{
                System.out.println(" No Match Found ");
            }
        }

        return false;
    }



        public static List<Map<String, String>> convertToMapFromCsv(String filePath)
                throws FileNotFoundException, IOException {

            BufferedReader in = new BufferedReader(new FileReader(filePath));
            List<Map<String, String>> namefreq = in.lines().skip(1).map(line -> line.split(COMMA)) // splitting csv
                    .map(line -> {
                        Map<String, String> map = new HashMap<>();
                        map.put("productcode", line[0]);
                        map.put("store", line[1]);
                        map.put("itemavailabilityscore", line[2]);
                        map.put("salesunitscore", line[3]);
                        map.put("totalscore", line[4]);
                        map.put("pdp_views", line[5]);
                        return map;
                    }).collect(Collectors.toList());

            System.out.println("testabc");
            return namefreq;
        }
    }
    **//junit assertion**
      In this new generic is of type  List<Map<String,String>> newGeneric which return the db data.FileComparatorUtility is class and the method compareTwoLists is declared above

您是否至少获得了正确的输出(我的意思是,如果它在应该的时候显示“已找到匹配项”)
您的地图列表是否从输入文件正确解析?
如果两者都是真的,那么问题来自不同的地方

在有问题的评论中,您的意思是,如果列表之间有一条记录不匹配,则断言应该失败。
当给定布尔表达式的计算返回false时,
assertFalse(boolean)
失败。
但是,还有一个
compareTowolists
之前,code>(布尔否定),因此
compareTowolists
方法必须返回
false
,并且由于
的原因,返回的
false
将被反转为
true
操作员。因此,当整个表达式的计算结果为
true
时,断言将失败

这样,当“未找到匹配项”时,
compareTowolists
方法应返回
false
,如果每个元素都匹配(在循环之后),则返回
true

“未找到匹配项”表示两个列表之间不匹配,如果返回
false
,则断言也将失败

一些旁白:

您的问题中没有关于您需要如何准确比较这些列表的信息。是否需要在sql列表中找到csv列表中的所有元素,或者以其他方式(csv中的所有sql)或两个列表应彼此相等

当在较大的列表中循环时,可以确定较小的列表不会包含给定元素的任何部分(至少在没有重复项的情况下)。
对于完全相等,您可以在排序列表上使用
listA.equals(listb)

根据哪个列表必须包含另一个列表的元素,您需要在for循环和if contains check中适当地使用它

我假设所有csv元素都必须在sql列表中找到。循环使用sql数据可能就足够了,但如果一个列表的元素比另一个列表的元素多怎么办?
如果要检查所有csv数据是否都在sql中,则应循环查看csv数据。csv中的元素可能比sql多,而sql数据中可能找不到这些多余的列表元素。但是,如果在sql数据中找到csv数据中的其他元素时,csv数据可以有其他元素,则可以通过sql数据进行循环。
如果sql数据中的数据多于csv数据中的数据,则csv肯定不会包含sql的某些元素(当这些元素不重复时)。
所以在这里,它应该在csv数据中循环,并检查其元素是否包含在sql数据中

无论如何,如果您想检查是否可以在sql数据中找到csv数据的每个元素,那么您应该循环使用csv数据。这将测试sql数据是否包含csv数据中的每个元素

使用您提供的代码示例和我上面的话,
CompareTowolists
的最后一部分可以更改为:

for (Map<String, String> i : csvData) {
    if (!sqlData.contains(i)) {
        System.out.println(" No Match Found: " + i);
        return false;
    }
}
return true;
如果您确定两个列表中的每个映射元素都有“productcode”,那么您的comparator函数就可以了。
但是,如果一个映射条目都不包含“productcode”键,则会从
sort
方法抛出NullPointerException,因为其中一个参数可能为null。
您的正确实现取决于我提到的其他情况,但对于大多数情况,您需要检查comparator函数中的两个参数在“productcode”键下是否都有一些(非空)值,例如:

Comparator<Map<String, String>> comp = (o1, o2) -> {
    if (o1.get("productcode") == null) {
        return -1;
    }
    if (o2.get("productcode") == null) {
        return 1;
    }
    return o1.get("productcode").compareTo(o2.get("productcode"));
};
比较器组件=(o1,o2)->{ if(o1.get(“productcode”)==null){ 返回-1; } if(o2.get(“productcode”)==null){ 返回1; } 返回o1.get(“productcode”)。与(o2.get(“productcode”))进行比较; };

对于冗长的回答,很抱歉,如果这些解释和IDK对其他人有用的话,您可能不需要这些解释和IDK,但让我们把它留在这里吧。:)

这回答了你的问题吗?正如您已经看到的,
void
不能用于断言。简单地说,将方法返回类型从
void
更改为
boolean
return true
而不是
break
,并在
循环
return true
的主体之后。我对其进行了修改。请参见。我们是否可以更好地检查数据库中的记录何时与CSV匹配,以及是否有单个记录不匹配然后断言应该失败谢谢你的回答。我将更改assertTrue(FileComparatorUtility.CompareTwoolists(csvData,newGeneric));如果找到匹配项,则返回true,如果没有匹配项,则返回fail。是的,该部分如何?好的,只是说,如果找到单个匹配项,则返回true将不会检查其他元素是否也匹配。那么在这种情况下,如果其他元素之间存在不匹配,那么应该怎么做
for (Map<String, String> i : csvData) {
    if (!sqlData.contains(i)) {
        System.out.println(" No Match Found: " + i);
        return false;
    }
}
return true;
list.sort(comp)
Comparator<Map<String, String>> comp = (o1, o2) -> {
    if (o1.get("productcode") == null) {
        return -1;
    }
    if (o2.get("productcode") == null) {
        return 1;
    }
    return o1.get("productcode").compareTo(o2.get("productcode"));
};