java - Junit断言

标签 java junit

**我正在对csv和db数据之间的两个列表进行比较,但是我返回的是void,因此我的断言无法正常工作。断言将起作用的更改应该是什么。我试着将返回值放在找到的匹配项以下,然后将返回值类型更改为boolean,但是它不起作用。

        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


assertFalse(!FileComparatorUtility.compareTwoLists(csvData,newGeneric));

    Its not working  when I put the following assertion as a junit what should I change in the code that when I do assertion in junit such that when there is match between csv and db data then it return true else it returns false

最佳答案

您是否至少获得了正确的输出(我的意思是,如果应该显示它,则显示“ Match Found”)?
是否从输入文件中正确解析了Map列表?
如果两者都成立,那么问题出在不同的地方。

在有问题的评论中,您说的是,如果列表之间存在单个记录不匹配,则断言将失败。
当给定的布尔表达式的计算返回false时,assertFalse(boolean)将失败。
但是,在!调用之前有一个compareTwoLists(布尔取反),因此compareTwoLists方法必须返回一个false,并且由于false的关系,此返回的true将被转换为!。操作员。因此,当整个表达式计算为true时,断言将失败。

有了它,当没有“找到匹配项”时,compareTwoLists方法应该返回false,如果每个元素都匹配(循环之后),则返回true

compareTwoLists -> return false
!compareTwoLists -> return true
assertionFalse(!compareTwoLists) -> assertion fails


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

一些副词:

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

当遍历较大的列表时,可以确定较小的列表将不包含给定元素(至少在没有重复项的情况下)。
为了完全相等,您只能在排序列表上使用listA.equals(listb)
根据哪个列表必须包含另一个元素,您需要在for循环中以及是否包含check时充分使用它。

我假设必须在sql列表中找到所有csv元素。遍历sql数据可能就足够了,但是如果一个列表比另一个列表包含更多的元素怎么办?
如果要检查所有csv数据都在sql中,则应遍历csv数据。 csv可能比sql具有更多的元素,并且在sql数据中可能找不到那些过多的list元素。但是,如果在sql数据中找到了来自csv数据的其他元素时,如果csv数据可以包含其他元素,则遍历sql数据就可以了。
如果sql数据中的数据多于csv数据中的数据,则csv肯定不会包含sql的某些元素(当这些元素不是重复元素时)。
因此在这里,它应该遍历csv数据并检查其元素是否包含在sql数据中。

无论如何,如果要检查是否可以在sql数据中找到csv数据的每个元素,则应遍历csv数据。如果sql数据包含csv数据中的每个元素,则将进行测试。

使用您提供的代码示例以及上面的内容,compareTwoLists的最后一部分可以更改为:

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


如您在代码中已经看到的,“比较”一词是保留的,用于检查一个对象是否小于/大于/等于另一个对象(因此它返回int来指示那些状态)。我建议您修改该方法名称,以说出参数中的哪个列表应包含在另一个列表中?
我建议您修改该方法名称以显式描述所需的输出,例如anyContainAnotherisFirstListContainedInSecond(但是,如果对所有标准进行编码,例如does2ndContain1stis1stIn2nd,则IDK可能看起来很长)。
尝试通过名称描述方法行为会简化对代码的理解,以后可以简化代码等价物。想要从断言中删除!或在所需列表比较返回assertTrue时使用true

此外,如果至少使用Java8,则可以将Collection.sort(list,comp)替换为:

list.sort(comp)


如果确定两个列表中的每个地图元素都具有“ productcode”,则比较器功能就可以了。
但是,即使一个映射条目都不包含“ productcode”键,也会从sort方法引发NullPointerException,因为其中一个参数可能为null。
正确的实现方式取决于我提到的其他情况,但是对于大多数情况,您需要检查比较器函数中的两个参数在“ productcode”键下是否都具有某些(非null)值,例如:

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"));
};


很抱歉LOOOOONG的答案,如果您认为这些说明和IDK似乎对其他人有用的话,可能不需要它们中的大多数,但请保留在此处。 :)

关于java - Junit断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60348924/

相关文章:

java - 将文件从应用程序复制到系统目录?

java - JUnit 为 com.google.common.collect.Iterables.tryFind 抛出 java.lang.NoSuchMethodError

java - 使用jmockit测试main方法

java - 实现 java.util.Collection<E> 和重写方法时出现问题

java - 如何在 3D 中的 LibGDX 中的两点之间画一条线

Java 并发性和范围

java - 为什么%运算符在C/C++中不能用于 float ,但在Java和C#中可以使用?

java - PowerMock:对采用 Object[] 作为参数的方法正确使用 Whitebox.invokeMethod(...)

java - 事件调度线程同步

java - 在没有 Maven 或 Gradle 的情况下将 JUnit 5 与 Java 9 结合使用