使用Junit的TriangleTest:不允许使用void类型

问题描述 投票:0回答:3

我有这段代码,我尝试使用Junit创建单元测试。当我尝试如下测试MAIN时;

@Test
public void testMain(){
    assertEquals(determineType(0,1,1),"ABCDEF");
}

它一直告诉我,此处不允许使用void类型。我该怎么办?


package triangle;

public class Triangle {


    public static void determineType(int a, int b, int c) {
        if (a >= (b + c) || c >= (b + a) || b >= (a + c)) {
            System.out.println("Not a Triangle");
        } else if (a == b && b == c) {
            System.out.println("Equilateral Triangle");
        } else if (((a * a) + (b * b)) == (c * c) || ((a * a) + (c * c)) == (b * b) || ((c * c) + (b * b)) == (a * a)) {
            System.out.println("Right Triangle");
        } else if (a != b && b != c && c != a) {
            System.out.println("Scalene Triangle");
        } else if ((a == b && b != c) || (a != b && c == a) || (c == b && c != a)) {
            System.out.println("Isosceles Triangle");
        }
    }

    public static void main(String[] args) {
        determineType(1, 1, 9);
    }
}
java junit compiler-errors void
3个回答
1
投票

尝试此代码,我已修复错误

TestCode

    @Test
    public void testMain(){
        assertEquals(determineType(0,1,1),"Not a Triangle");
    }

SourceCode

package triangle;

public class Triangle {


    public static String determineType(int a, int b, int c) {

        if (a >= (b + c) || c >= (b + a) || b >= (a + c)) {
            return "Not a Triangle";
        } else if (a == b && b == c) {
            return "Equilateral Triangle";
        } else if (((a * a) + (b * b)) == (c * c) || ((a * a) + (c * c)) == (b * b) || ((c * c) + (b * b)) == (a * a)) {
            return "Right Triangle";
        } else if (a != b && b != c && c != a) {
            return "Scalene Triangle";
        } else if ((a == b && b != c) || (a != b && c == a) || (c == b && c != a)) {
            return "Isosceles Triangle";
        }
        // other case
        return null;
    }

    public static void main(String[] args) {
        System.out.println(determineType(1, 1, 9));
    }
}

0
投票

如果您是我,我会稍微改变一下方法,而不是打印出来,我将返回一个表示Triangle类型的枚举。在其他地方测试和实际使用该方法会容易得多。

public class Triangle {

    public static TriangleType determineType(int a, int b, int c) {
        if (a >= (b + c) || c >= (b + a) || b >= (a + c)) {
            return TriangleType.NONE;
        } else if (a == b && b == c) {
            return TriangleType.EQUILATERAL;
        } else if (((a * a) + (b * b)) == (c * c) || ((a * a) + (c * c)) == (b * b) || ((c * c) + (b * b)) == (a * a)) {
            return TriangleType.RIGHT;
        } else if (a != b && b != c && c != a) {
            return TriangleType.SCALENE;
        } else if ((a == b && b != c) || (a != b && c == a) || (c == b && c != a)) {
            return TriangleType.ISOSCELES;
        }
        return TriangleType.NONE;
    }

    public static void main(String[] args) {
        final TriangleType type = determineType(1, 1, 9);
        System.out.println(type);
    }

    enum TriangleType {
        EQUILATERAL, RIGHT, SCALENE, ISOSCELES, NONE
    }
}

测试将如下:

@Test
public void determineType() {
    Assertions.assertAll(
            () -> assertEquals("Should be isosceles", Triangle.TriangleType.ISOSCELES, Triangle.determineType(2, 2, 3)),
            () -> assertEquals("Should be equilateral", Triangle.TriangleType.EQUILATERAL, Triangle.determineType(2, 2, 2)),
            () -> assertEquals("Should be right", Triangle.TriangleType.RIGHT, Triangle.determineType(4, 3, 5))
    );
}

0
投票

可以测试不返回任何东西的方法(无效),但是您必须测试该方法的副作用,但是在您的情况下,determineType方法没有显示任何副作用,它更像是一种检查方法并且不返回任何内容,例如void,并且由于它不返回任何内容,因此您无法使用assertEquals(expected,actual),因为assertEquals始终是操作的实际结果与预期结果之间的比较。

因此,为了测试此方法,您可以将determineType方法的返回类型从void更改为String(即,删除sysouts,而只是return每个比较条件的结果r \ eg “不是三角形”等)。

然后,5不同的测试用例将检查determineType方法中指定的每个条件,并将返回的String与预期输出进行比较。

类似,

    @Test
    public void testNotATriangle(){
        assertEquals(determineType(0,1,1), "Not a Triangle");
    }

    @Test
    public void testEquilateralTriangle(){
        assertEquals(determineType(1,1,1), "Equilateral Triangle");
    }

    // other test case here, for each condition

   public static String determineType(int a, int b, int c) {

        if(a >= (b+c) || c >= (b+a) || b >= (a+c) ) {
            return "Not a Triangle";
        } else if(a==b && b==c) {
            return "Equilateral Triangle";
        } else if (((a * a) + (b * b)) == (c * c) || ((a * a) + (c * c)) == (b * b)|| ((c * c)      + (b * b)) == (a * a)) {
            return "Right Triangle";
        } else if(a!=b && b!=c && c!=a) {
            return "Scalene Triangle";
        } else if ((a==b && b!=c ) || (a!=b && c==a) || (c==b && c!=a)) {
            return "Isosceles Triangle";
        }
        return null;
    }

    public static void main(String [] args) {
        determineType(1,1,9);
    }
© www.soinside.com 2019 - 2024. All rights reserved.