1.4-Software-Development-Principles

Cijfersysteem

Inleiding

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.

Opdracht 1

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.

Opdracht 2

Het cijfersysteem kan alleen uit CSV bestanden lezen. Voeg de mogelijkheid toe om ook cijfers uit een JSON bestand en een database te lezen.