英文:
Practicing JUnit strange behavior comparing strings
问题
我第一次尝试使用JUnit,并且遇到了一个奇怪的错误:
方法上的测试是正常的,但是当我在主方法中尝试我的第一个测试时,它失败了,没有任何原因。这是测试的代码:
@Test
public void MyTestMain1(){
String input = "1\n2\n2\n";
ByteArrayInputStream in = new ByteArrayInputStream(input.getBytes());
System.setIn(in);
ByteArrayOutputStream out = new ByteArrayOutputStream();
System.setOut(new PrintStream(out));
String [] args = {};
Demo.main(args);
// 期望输出:
String consoleOutput = "Enter side 1: \n";
consoleOutput += "Enter side 2: \n";
consoleOutput += "Enter side 3: \n";
consoleOutput += "This is a triangle.\n";
assertEquals(consoleOutput, out.toString());
}
这是我的主类的代码:
public class Demo {
public static void main(String[] args) {
// 从System.in读取
Scanner reader = new Scanner(System.in);
System.out.println("Enter side 1: ");
// 将输入的下一个标记扫描为int。
int side_1 = reader.nextInt();
System.out.println("Enter side 2: ");
// 将输入的下一个标记扫描为int。
int side_2 = reader.nextInt();
System.out.println("Enter side 3: ");
// 将输入的下一个标记扫描为int。
int side_3 = reader.nextInt();
if (isTriangle(side_1, side_2, side_3)) {
System.out.println("This is a triangle.");
}
else {
System.out.println("This is not a triangle.");
}
reader.close();
}
public static boolean isTriangle(double a, double b, double c) {
if ((a + b > c) &&
(a + c > b) && // 应该是 a + c > b
(b + c > a)) {
return true;
}
return false;
}
}
这很简单,但它失败了,原因是一些奇怪的隐藏字符,我不知道它们来自哪里。
这是JUnit的输出:
如果我双击它,我看到的是:
在第一张图中,似乎有一个额外的 "\n",但在第二张图中没有。而且,如果我手动添加它,那么相同的错误将出现,尽管现在第二张图将显示有一个额外的 \n。
英文:
I have been trying JUnit for the first time and I am facing a strange error:
Tests on method are okay, but when I tried my first test in the main method, it fails without reason. This is the code for the test:
@Test
public void MyTestMain1(){
String input = "1\n2\n2\n";
ByteArrayInputStream in = new ByteArrayInputStream(input.getBytes());
System.setIn(in);
ByteArrayOutputStream out = new ByteArrayOutputStream();
System.setOut(new PrintStream(out));
String [] args = {};
Demo.main(args);
// expected output:
String consoleOutput = "Enter side 1: \n";
consoleOutput += "Enter side 2: \n";
consoleOutput += "Enter side 3: \n";
consoleOutput += "This is a triangle.\n";
assertEquals(consoleOutput, out.toString());
}
And here the code of my main class:
public class Demo {
public static void main(String[] args) {
// Reading from System.in
Scanner reader = new Scanner(System.in);
System.out.println("Enter side 1: ");
// Scans the next token of the input as an int.
int side_1 = reader.nextInt();
System.out.println("Enter side 2: ");
// Scans the next token of the input as an int.
int side_2 = reader.nextInt();
System.out.println("Enter side 3: ");
// Scans the next token of the input as an int.
int side_3 = reader.nextInt();
if (isTriangle(side_1, side_2, side_3)) {
System.out.println("This is a triangle.");
}
else {
System.out.println("This is not a triangle.");
}
reader.close();
}
public static boolean isTriangle(double a, double b, double c) {
if ((a + b > c) &&
(a + c > b) && // should be a + c > b
(b + c > a)) {
return true;
}
return false;
}
}
It is very simple, but it is failing and the reason is some strange hidden character that I don't know where is coming from.
Here is the output by JUnit:
And here what I see if I double click on it:
In the first image it appears to be an additional "\n" but in the second one it doesn't appear. Also, if I add it manually then the same error will appear, though now the second image will be the one showing that there is an additional \n.
答案1
得分: 0
Line separators are platform dependant. For example, For Windows, Line Separator means \r\n
\r - carriage return
\n - new line
The problem is that the expected String has \n only while when the String gets generated using Scanner, it has \r\n. Due to this both strings were not equal.
To solve this issue, you can add platform independent line separator through
System.lineSeparator()
Using this will ensure, the code doesn't break in other operating systems.
英文:
Line seperators are platform dependant. For example, For Windows, Line Separator means \r\n
\r - carriage return
\n - new line
The problem is that the expected String has \n only while when the String gets generated using Scanner, it has \r\n. Due to this both strings were not equal.
To solve this issue, you can add platform independent line separator through
System.lineSeparator()
Using this will ensure, the code doesn't break in other operating systems.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论