Oefening 2: Objectoriëntatie aan het einde van het universum
Doel
Schrijf klassen en testen voor deze klassen.
Opdracht
Maak een klasse voor een breuk en schrijf testen.
Testen
Maak een nieuw project. Maak een klasse Breuk. Maak een Unit Test TestBreuk.
Figuur 1: Maak een nieuwe Unit Test: TestBreuk.
Maak twee attributen van het type int in de klasse Breuk, teller en noemer.
- Schrijf een constructor in de klasse Breuk waarin twee argumenten van het type int worden meegegeven, teller en noemer.
- Maak getters voor de attributen van de klasse Breuk.
Schrijf een test testTellerEnNoemer in TestBreuk waarin een nieuw Breuk object wordt gemaakt en de teller en noemer via de getters worden gecontroleerd met de opgegeven teller en noemer.
@Test public void testTellerEnNoemer(){ Breuk eenTweede = new Breuk(1,2); assertEquals(1, eenTweede.getTeller()); assertEquals(2, eenTweede.getNoemer()); Breuk vierDerden = new Breuk(4,3); assertEquals(4, vierDerden.getTeller()); assertEquals(3, vierDerden.getNoemer()); }
- @Test is een annotatie van de methode testTellerEnNoemer om die te identificeren als een test.
- assertEquals is een methode waarin gecontroleerd wordt indien een verwachte waarde gelijk is aan een actuele waarde. Indien deze waardes niet gelijk zijn dan faalt de test. Indien deze waardes wel gelijk zijn dan slaagt de test.
- Voer de test uit. Indien de test faalt, schrijf dan de nodige code om die te laten slagen.
Gelijkheid
- Maak een nieuwe test testGelijkheidBreuken.
@Test public void testGelijkheidBreuken(){ Breuk eenTweede = new Breuk(1,2); Breuk nogEenTweede = new Breuk(1,2); assertEquals(eenTweede, nogEenTweede); }
Voer de testen uit.
Vraag 1
Waarom slaagt deze test niet?
Definieer een equals methode voor de klasse Breuk.
public boolean equals(Object other){ if(other instanceof Breuk){ Breuk that = (Breuk) other; return that.teller == this.teller && that.noemer == this.noemer; } else return false; }
Voer opnieuw de testen uit. Breid de test voor gelijkheid verder uit.
Vraag 2
Welke methode kan je gebruiken om twee objecten te testen die niet gelijk zijn? Tip: https://junit.org/junit4/javadoc/latest/org/junit/Assert.html
Refactoring
Refactoring is het aanpassen van software zonder de functionaliteit ervan te wijzigen met als doel de leesbaarheid en onderhoudbaarheid te verhogen. Bijvoorbeeld door namen van variabelen te wijzigen of duplicatie van code te verwijderen. Pas de code van de testen aan zodat slechts 1 keer de constructor van Breuk voor de objecten eenTweede en drieVierden wordt aangeroepen. Tip: maak van de objecten eenTweede en drieVierden attributen van de testklasse en plaats de aanroep van de constructor in de setUp methode. De setUp methode wordt aangeroepen voor elke @Test methode.
Figuur 2: Voor elke test methode wordt een setup methode, aangeduid met de annotatie @Before aangeroepen. Na het uitvoeren van de test wordt de teardown methode aangeroep, aangeduid met @After.
Roep opnieuw de testen aan. Indien alle testen blijven slagen dan is de functionaliteit van de software niet gewijzigd. Indien plots een test faalt, betekent dat er een fout tijdens het refactoren is gebeurd.
toString
Maak een toString methode die de breuk 1/2 als volgt weergeeft:
1 - 2
- Schrijf een test voor de toString methode.
Wiskundige bewerkingen
Voorzie de volgende methodes voor de klasse Breuk:
Figuur 3: UML klassendiagram voor Breuk
- Het resultaat van een wiskundige bewerking levert een nieuw Breuk object op. Pas niet de attributen van het huidig object aan.
- Tip: Voor de methode maal met een geheel getal kan je gebruik maken van de methode maal met een breuk. y/z x = y/z x/1
- Tip: Voor de methode deel kan je gebruik maken van de methode maal. z/w / x/y = z/w * y/x
- Voorzie de nodige testen.
Vereenvoudigen van breuken
- Maak een methode Breuk vereenvoudig(), die de breuk vereenvoudigt tot de eenvoudigste vorm. Hiervoor heb je de grootste gemene deler nodig van teller en noemer. Maak hiervoor gebruik van het Algoritme van Euclides.
- Schrijf de nodige testen hiervoor.
- Pas de equals methode aan zodat breuken die niet vereenvoudigd zijn toch als gelijk worden aangegeven. bvb. 1/2 en 2/4 zijn gelijk.
Schrijf een extra test om dit gedrag te testen.
Vraag 3
Wat is de meest vereenvoudigde vorm van de breuk 192/270?
Omzetten naar een kommagetal
- Maak een methode double toDouble() voor de klasse Breuk waarbij de waarde van de breuk als kommagetal wordt berekend.
Schrijf hiervoor een test. Tip: de methode assertEquals voor doubles heeft een derde parameter nodig delta.
Vraag 4
Wat is de betekenis van de delta parameter bij de methode assertEquals?
Extra
- Maak een klasse voor complexe getallen. Voorzie constructoren en methodes. Schrijf de nodige testen.