Поскольку 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);
}
}