HalloJungs,
ich muss eine Testmethode schreiben und prüfen, ob nur eindeutige Personen hinzugefügt werden können.@Testpublicvoidtest_addPerson_liefert_true(){Person p1 =newPerson("name1,1);Assertions.assertTrue(test.addPerson(p1));}Nun möchte ich die andere Seite der Medaille testen und zwei identische Personen hinzufügen wie gehe ich damit am besten um?@Testpublicvoidtest_addPerson_liefert_false(){Person p1 =newPerson("name1,1);Assertions.assertTrue(test.addPerson(p1));Assertions.assertFalse(test.addPerson(p1));}
Vom Prinzip her ist es doch schon das, was du brauchst. Musst Du nur in eine Form bringen, die übersetzbar ist. Und Du musst die Spezifikation genau prüfen - was am Status kannst Du alles prüfen? Ggf. prüft man auch Dinge wie: Ist die Anzahl der Elemente unverändert nach der zu testenden Aktion.
Und was auch auffällt: Du testest in dem Test nicht nur das Hinzufügen einer bereits vorhandenen Person sondern auch das erste Hinzufügen. Das kann - wenn man strenge Regeln hat - auch schon als unerwünscht angesehen werden.
Was für Beispiele brauchst Du hier noch? Du hast ja in Deinem Code die Tests eigentlich schon - wenn man mal davon absieht, dass die Variable test nicht deklariert & initialisiert wurde.
Daher sehe ich gerade nicht, an welchem Punkt es gerade bei Dir "hängt" und was ich Dir daher zeigen könnte.
JavaCodeGeeks bietet eine kostenlose Registrierung und danach hat man Zugriff auf viele (teilweise ältere) EBooks. Darunter auch welche zu JUnit und Mocking (nur JUnit 4 meine ich). Aber man bekommt da dann auch regelmäßig Werbung und Infos per Email. Die Seite bietet darüber auch noch etwas mehr und die Emails von Zeit zu Zeit sind da ein kleiner Preis denke ich (Ich habe damit keine Probleme).
Das wären paar freie Quellen - es gibt aber auch ein paar gute Bücher zu JUnit 5, die interessant sein könnten so man Bücher bevorzugt. Ansonsten findet man sehr viel Einführungen und Erklärungen per Google.
Das Problem bei meinem Test besteht darin, dass p1 immer neu hinzugefügt wird und ich nur einmal testen kann. Ich habe noch kein Plan, wie ich die liste aus +1, +2 ect. testen kann. Das die Liste größer geworden ist, bzw. unverändert geblieben ist…
@test
public void test_addPerson_liefert_false() {
Person p1 = new Person("name1, 1);
//test ist zu testende klasse
Assertions.assertTrue(test.addPerson(p1));
Assertions.assertFalse(test.addPerson(p1));
}
Das Problem bei meinem Test besteht darin, dass p1 immer neu hinzugefügt wird und ich nur einmal testen kann. Ich habe noch kein Plan, wie ich die liste aus +1, +2 ect. testen kann. Das die Liste größer geworden ist, bzw. unverändert geblieben ist…
packagecom.java.testpolygon.personservice;importcom.java.testpolygon.domain.Person;importjava.util.ArrayList;importjava.util.List;publicclassPersonServiceImplimplementsPersonService{@OverridepublicbooleanaddPerson(Person argPerson){List<Person> list =newArrayList<>();if(list.contains(argPerson)){return list.add(argPerson);}returnfalse;}}
Java:
packagecom.java.testpolygon.domain;publicclassPerson{privateString name;privateint age;publicPerson(String name,int age){this.name = name;this.age = age;}publicStringgetName(){return name;}publicvoidsetName(String name){this.name = name;}publicintgetAge(){return age;}publicvoidsetAge(int age){this.age = age;}@OverridepublicStringtoString(){return"Person{"+"name='"+ name +'\''+", age="+ age +'}';}@Overridepublicbooleanequals(Object obj){boolean result =false;if(obj ==null|| obj.getClass()!=getClass()){returnfalse;}else{Person person =(Person) obj;if(this.name.equals(person.getName())){
result =true;}}return result;}}
Java:
packagecom.java.testpolygon.personservice;importcom.java.testpolygon.domain.Person;importorg.junit.jupiter.api.Assertions;importorg.junit.jupiter.api.Test;publicclassPersonServiceImplTest{@TestpublicclasstestAddPerson(){Person person =newPerson("a",1);PersonServiceImpl test =newPersonServiceImpl();Assertions.assertTrue(test.addPerson(person));// OKAssertions.assertFalse(test.addPerson(person));// NOK}}
Konrad danke für die Antwort. Was würdest du da anders machen?
Die Vorgabe ist, dass Person genau nur einmal da sein darf und die Methode true zurückliefen soll, wenn er zur Collection erfolgreich hinzugefügt wurde
local, ich habe die Liste rasgenommen und global deklariert:
trotzdem:
Java:
publicclassPersonServiceImplimplementsPersonService{List<Person> list =newArrayList<>();@OverridepublicbooleanaddPerson(Person person){if(list.contains(argPerson)){return list.add(person);}returnfalse;}}
Es soll eine eindeutige Person zu einer Collection hinzugefügt werden und die Methode soll true zurückliefen, falls diese Person hinzugefügt wurde und false, falls die Person schon in der Collection vorhanden war.
Das ist die Anforderung - aber was macht Dein Code? Schau was Dein Code macht.
Füge ansonsten zu Allem ein Kommentar hinzu, das den Code Deiner Meinung nach erläutert.
List<Person> list =newArrayList<>();publicbooleanaddPerson(Person person){if(list.contains(person)){// wenn vorhanden, dann falsereturnfalse;}else{return list.add(argPerson);// sonst einfügen und true zurückliefern}}
Ja, vielen Dank. Könntest du mir vlt. noch zeigen, wie man adden auf moderne Art und weite mit Streams realisieren könnte und was man noch testen kann. Vielen Dank
Wenn Du Deine Klasse auch mit Streams nutzen können willst, dann schau Dir einfach einmal an, was da so an Möglichkeiten vorhanden sind. Wenn Du Elemente eines Streams einsammeln willst, dann wird ja collect benutzt. Da kannst Du also schauen, was da so benötigt wird.
Ansonsten musst Du Dir überlegen, was für Funktionalität du haben willst. Und jede Funktionalität, die Du hinzu fügst, musst Du dann auch testen.