我有这段代码,我尝试使用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);
}
}
尝试此代码,我已修复错误
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));
}
}
如果您是我,我会稍微改变一下方法,而不是打印出来,我将返回一个表示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))
);
}
可以测试不返回任何东西的方法(无效),但是您必须测试该方法的副作用,但是在您的情况下,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);
}