Java 使用Compariable[]为二进制搜索方法编写JUnit测试

Java 使用Compariable[]为二进制搜索方法编写JUnit测试,java,junit,Java,Junit,请注意,我是初学者 我正在尝试为以下代码编写一组测试用例: int binarySearch(Comparable[] objArray, Comparable searchObj) { int low = 0; int high = objArray.length - 1; int mid = 0; //iterative binary search algorithm while (low <= hig

请注意,我是初学者

我正在尝试为以下代码编写一组测试用例:

int binarySearch(Comparable[] objArray, Comparable searchObj) {

        int low = 0;
        int high = objArray.length - 1;
        int mid = 0;

        //iterative binary search algorithm
        while (low <= high) {
            mid = (low + high) / 2;

            if (objArray[mid].compareTo(searchObj) < 0) {
                low = mid + 1;
            } else if (objArray[mid].compareTo(searchObj) > 0) {
                high = mid - 1;
            } else {
                return mid;
            }
        }
        //return target index position
        if (objArray[mid].compareTo(searchObj) > 0) {
            return mid;
        } else
            return mid + 1;
    }

    @Test
    public void testBinarySearch() {

        //Test for lower boundary of array
        BinarySearch ob = new BinarySearch();
        Comparable[] array = {10, 20, 30, 40, 50};
        int result = ob.binarySearch(array, 5);
        System.out.println("Index position should return 0. Result is:  " + result);


    }
如您所见,我已经为我的第一个测试用例编写了逻辑,它正在返回正确的结果。然而,我似乎不知道如何将它重写为JUnit测试,这样我还可以编写额外的测试,比如数组的测试上限


我不确定是应该使用Assert还是assertArrayEquals。我以前从未使用过JUnit,可能忽略了一些相对简单的东西

良好的开端。不要再考虑打印,而是直接验证。这是您的第一个重写到junit的测试:

@Test
public void testLowerBoundaryOfArray() {
    BinarySearch ob = new BinarySearch();
    Comparable[] array = {10, 20, 30, 40, 50};
    int result = ob.binarySearch(array, 5);
    Assert.assertEquals("Index position should be as expected", 0, result);

}
注意,我还以测试的内容命名测试,而不是在注释中说明


Assert.assertEquals有两个或三个参数,第一个是可选的测试步骤说明。第二个是期望,第三个是实际结果。有人可能会说,在您的案例中,并不需要期望消息,但我将其包含在API的完整演示中。

如果您在项目中导入了Junit库

导入org.junit.Assert

然后你可以轻松地:

Assert.assertEqualsexpected,实际


其中expected是您从binarySearch中期望的值,实际值是应该返回的值。

这非常有用!非常感谢。附加问题:这样编写单独的测试是最好的形式吗?那么下一个将是public void testUpperBoundaryOfArray,并遵循相同的语法/设置?@Giuseppe取决于您想要如何构造它。在同一个方法中断言几次是没有问题的,报告将以干净的形式出现。我更愿意为您认为要测试的特定事物创建方法,例如TestEmptyTreech、testFullTree、testExistingElement、testSingleLineTree、TestUpperBoundOverMax、testLowerBoundBelowMax,以及在两个测试用例之间创建更多的方法,在这些测试用例中,我会围绕您选择的值断言元素