Практика странного поведения JUnit при сравнении строк - PullRequest
0 голосов
/ 01 августа 2020
• 1000 Это код для теста:
    @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());
    }

А вот код моего основного класса:

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

}

Он очень простой, но не работает и причина в какой-то странной скрытый символ, откуда я не знаю.

Вот вывод JUnit:

And here what I see if I double click on it:

введите описание изображения здесь

На первом изображении он выглядит как дополнительный "\ n", но на втором он не появляется. Кроме того, если я добавлю его вручную, появится та же ошибка, хотя теперь второе изображение будет тем, которое показывает, что есть дополнительный \ n.

1 Ответ

0 голосов
/ 01 августа 2020

Разделители строк зависят от платформы. Например, для Windows разделитель строк означает \ r \ n

\r - carriage return
\n - new line

Проблема в том, что ожидаемая строка имеет \ n только тогда, когда строка создается с помощью сканера, она имеет \ r \ n . Из-за этого обе строки не были равны.

Чтобы решить эту проблему, вы можете добавить независимый от платформы разделитель строк через

System.lineSeparator()

. Это гарантирует, что код не сломается в других операционные системы.

...