We hebben een cijfersysteem dat zijn gegevens krijgt van een externe bron en het gemiddelde cijfer terug schrijft naar een externe bron. We hebben nu dus een indirecte invoerbron en een indirecte uitvoerbron. Dit maakt het moeilijk voor ons om het systeem te testen.
Jouw taak is om het systeem te refactoren zodat we ons cijfersysteem kunnen testen.
De code voor het cijfersysteem staat in dit zip bestand. Er is ook een voorbeeld csv bestand.
De code bestaat uit drie klassen: Student
, GradeReader
en GradingSystem
.
Student
is een klasse om de gegevens van een student op te slaan, inclusief de cijfers.
GradeReader
haalt de gegevens van de student uit een bestand.
GradingSystem
is het programma dat de eindcijfers berekent.
public class GradingSystem {
private GradeReader gradeReader;
public GradingSystem(GradeReader gradeReader) {
this.gradeReader = gradeReader;
}
public void calculateFinalGrades() {
// Read the grades from the file
List<Student> students = gradeReader.readGrades();
// Calculate the mean grade for each student
for (Student student : students) {
int sum = 0;
for (int grade : student.getGrades()) {
sum += grade;
}
int meanGrade = sum / student.getGrades().size();
// Replace the student's grades with the mean grade
student.getGrades().clear();
student.getGrades().add(meanGrade);
}
// Write the final grades back to the file
gradeReader.writeFinalGrades(students);
}
}
Hier is een voorbeeld van hoe je een unit test voor dit systeem zou kunnen schrijven:
public class GradingSystemTest {
@Test
public void testCalculateFinalGrades() {
// Use the mock grade file for testing
GradeReader reader = new GradeReader(...,...);
GradingSystem system = new GradingSystem(reader);
// Run the grading system and capture the output
system.calculateFinalGrades();
// Check that the output is as expected based on grades
assertEquals("Expected Output",....);
}
}
Het probleem is dat we geen controle hebben over de indirecte invoer en de indirecte uitvoer voor de klasse GradingSystem. Om controle te krijgen over deze input en outpyt kunnen we gebruik maken van interface om indirecte data stromen te managen voor unit testing.
Refactor het systeem zodat we onze klasse GradingSystem
kunnen testen. We willen 100% code coverage op de klasse GradingSystem.
Hint: Alles gebeurt nu in 1 grote operatie waarbij we geen tussenstappen kunnen benaderen.
Het cijfersysteem kan alleen uit CSV bestanden lezen. Voeg de mogelijkheid toe om ook cijfers uit een JSON bestand en een database te lezen.