Тест Junit для чтения файлов параметров сканера - PullRequest
1 голос
/ 02 августа 2020

Я пытаюсь просто написать тест для функции calcGrade(scanner sc), но я не знаю, можно ли протестировать его в этом сценарии, поскольку сканер считывает оценки в текстовом файле, а затем возвращает среднее значение. из них.

public static void main(String[] args) throws FileNotFoundException {
        
        Scanner sc = new Scanner(new FileReader("./Src/Chapter3/grade.txt"));
        
        System.out.printf("The average grade is: %.2f", calcGrade(sc));
                
    }

    public static double calcGrade(Scanner sc) {
        double test1, test2, test3, test4, test5, avg;

        test1 = sc.nextDouble();
        test2 = sc.nextDouble();
        test3 = sc.nextDouble();
        test4 = sc.nextDouble();
        test5 = sc.nextDouble();
        avg = (test1 + test2 + test3 + test4 + test5) / 5.0;
        
        sc.close();
        return avg;
    }

 @Test

    public void testCalGrade() {
    double expected = 70.0;
    double actual = js.calcGrade(); //i could change the parameter here instead passed in scanner to the individual grades then test it
    assertEquals(expected, actual,0.02);
}

grade.txt

80 98 100 78 65.6

Ответы [ 2 ]

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

Сканер имеет несколько конструкторов, поэтому вы можете выбрать другой и использовать его.

См. Возможные конструкторы

Пример того, как вы можете изменить свой тест

 @Test
 public void testCalGrade() {
    double expected = 70.0;
    double actual = js.calcGrade(new Scanner("80 98 100 78 65.6"));
    assertEquals(expected, actual,0.02);
}
0 голосов
/ 02 августа 2020

Поскольку Scanner является последним классом, вы не можете предоставить макет (или любой поддельный объект) вместо использования реального объекта Scanner в тесте.

Хотя теоретически вы все равно можете создать макет, используя внешние библиотеки ( например PowerMock) или изменить поле System.in, лучше сделать метод calcGrade более универсальным c. Например, он может принять поставщика вместо сканера. Вот пример.

    public static double calcGrade(Supplier<Double> valueSupplier) {
        double test1, test2, test3, test4, test5, avg;

        test1 = valueSupplier.get();
        test2 = valueSupplier.get();
        test3 = valueSupplier.get();
        test4 = valueSupplier.get();
        test5 = valueSupplier.get();
        avg = (test1 + test2 + test3 + test4 + test5) / 5.0;

        return avg;
    }

Тогда вы можете назвать это так

    public static void main(String[] args) throws FileNotFoundException {

        Scanner sc = new Scanner(new FileReader("./Src/Chapter3/grade.txt"));

        System.out.printf("The average grade is: %.2f", calcGrade(sc::nextDouble));
        sc.close();
    }

Если вы не знаете синтаксиса sc::nextDouble, он называется ссылкой на метод и в основном вызывает sc.nextDouble() при вызове valueSupplier.get().

Тогда вы можете протестировать его вот так

public class CalGradeTest {

    private int index;

    @Test
    public void testCalGrade() {
        CalGrade js = new CalGrade();
        double[] testValues = {68.0, 69.0, 70.0, 71.0, 72.0};
        double expected = 70.0;
        double actual = js.calcGrade(() -> testValues[index++]);
        assertEquals(expected, actual, 0.02);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...