Problem beim erstellen eines Tests

Hallo liebes Forum und zwar will ich zu meinem Programm einen Test erstellen, [jUnit] ..weiß aber nicht ganz wie ich das machen soll...

ich werde euch jetzt nicht gen ganzen Code reinkopieren aber hier mal der Teil:

Java:
/*
 * Adding Worker
 */
@Override
public void addWorker(String firstName, String lastName, double salary){
	Worker p = new Worker(firstName,lastName,salary);
	pListe.push(p);
}

das hier soll getestet werden. ein Worker wird mit firstName lastName und salary hinzugefügt in eine pListe

Java:
	@Test
	public void testGetWorkerCount(){
		assertTrue(enterprise.getWorkerCount()==0);
		testsPassed++;
	}
	
	@Test
	public void testaddWorker(){
		assertTrue(enterprise.addWorker("James", "Bond", 30000));
		testsPassed++;
	}

das obere geht, war auch vorgegeben,
das untere ist der von mir erstellte neue test addWorker

bei assertTrue meckert er aber... kann mir jemand verraten was ich da ändern muss
 
Zuletzt bearbeitet:
addWorker() gibt void zurück. Was willst du dort auf true überprüfen? Du kannst zum Beispiel diese Methode aufrufen und danach testen, ob size() 1 zurückgibt. Ob get...() wieder diese Werte zurückliefert etc.
 
bei assertTrue meckert er aber... kann mir jemand verraten was ich da ändern muss
assertTrue erwartet eine boolean, die Methode liefert aber void

testsPassed++ klingt nicht so, als ob du JUnit richtig nutzt/verstehst.

Wenn pListe (schlechter Name übrigens) durch ein Mock zu ersetzen wäre, könnte das eine Möglichkeit sein, aber Code muss bestimmte Merkmale ausweisen um testbar bzw. einfach testbar zu sein.
 
die Methode addWorker hat keinen Rückgabewert. Wenn nichts von der Methode zurückgegeben wird kann man ja auch nicht auswerten ob der Ausdruck true oder false ist.

EDIT:// zu spät 😉
 
So was?
Java:
    @Test
    public void testaddWorker() {
        enterprise.addWorker("James", "Bond", 30000)
        assertTrue(enterprise.getWorkerCount() == 0);
        Worker worker = enterprice.getWorker(); // oder wie auch immer...
        assertEquals(worker.getFirstName(), "James");
        assertEquals(worker.getLastName(), "Bond");
        assertEquals(worker.getSalary(), 30000);
    }
 
Wie kann ich dass dann machen, habe echt 0 plan wie das mit dem Testen gehen soll, wäre erfreut, wenn mir das jemand verraten könnte
"Verraten" klingt so als ob es ein Geheimnis wäre wie man JUnit nutzt und Tests schreibt.

Das einzige Gemheimnis ist der Code den du testen willst, addWorker bietet da nicht viel, wenn du zB. in er Lage wärest dier diese "pList" geben zu lassen, könntest du ja prüfen, ob es einen Worker gibt mit den Werten die du übergeben hattest.
 
Java:
  @Test
    public void testaddWorker() {
        enterprise.addWorker("James", "Bond", 30000);
        assertTrue(enterprise.getWorkerCount() == 0);
        Worker worker = enterprise.getWorker(); 
        assertEquals(worker.getfirstName(), "James");
        assertEquals(worker.getlastName(), "Bond");
        assertEquals(worker.getsalary(), 30000);
    }

bei getWorker();

sagt eclipse mir: The method getWorker() is undefined for the type Enterprise
 
Das Problem ist, dass ich den ganzen Code nicht ganz veröffentlichen will, da ich nicht möchte, dass mir das jemand 1:1 kopiert... hab dir deshalb ne PN geschickt, wäre nett du dir das anschaust, wenn du willst, vielleicht weißt du dann wo mein Problem besteht...danke
 
Wie wärs, wenn du einfach die Methode, welche dir den Worker wieder zurückgeben sollte, aufrufst? das [c]getWorker()[/c] war nur ein Beispiel / eine Idee.
 
Wellensittich, keiner hier will deinen ganzen Code (ich eingeschlossen).
Ich mache keine Arbeit umsonst in PMs, das hier ist ein öffentliches Forum, PMs widersprechen diesem Prinzip.

Denke einfach dass dein problem ist dass du mit Unittest nix anfangen kannst und nicht wirklich weisst worum es geht, dir hilft kein Copy&Paste aus einem Forum, du brauchst die Grundlagen zum schreiben von Unittests.

Im Prinzip geht es ja nur darum, dass du irgendwie verifizieren kannst, dass der Code das macht was er soll, d.h. du brauchst eine Möglichekit zu überprüfen, ob addWorker einen neuen worker erstellt, mit den übergebenen Werten.

Ich hab ja schon geschrieben/gefragt, ob du die pList gebe lassen kannst, dann könnte der Test prüfen (und damit testen) ob der Worker hinzugefügt worden ist.
Wenn nicht, gibt es wohl keine Möglichkeit zu testen, ob addWorker wirklich macht was es soll, könntest höchstens versuchen die Größe der Liste zu überprüfen
 
Zuletzt bearbeitet von einem Moderator:
Bevor ich noch mehr an dem letzten Post editiere, hier mal ein bisschen ungetesteter (Pseudo) Testcode:
Java:
  @Test
    public void testaddWorker() {
        final String firstName = "James";
        final String lastName = "Bond";
        final int salary = 30000;

        enterprise.addWorker(firstName, lastName, salary);

        assertEquals("worker count", 1, enterprise.getWorkerCount());

        Worker worker = enterprise.getWorkerList().get(0); 

        assertEquals("firstName", firstName, worker.getfirstName());
        assertEquals("lastName", lastName, worker.getlastName());
        assertEquals("salary", salary, worker.getsalary());
    }
 
Man könnte jetzt einwenden, dass der Test zu viel testet, aber das geht wohl an der Problematik der TE vorbei.

Außerdem ist er so nicht unabhängig von der Ausführungsreihenfolge, da du das Objekt
Code:
enterprise
nicht selbst anlegst. Ist die Liste wirklich vorher leer?

Falls sich das nicht vermeiden lässt, ermittle die Größe vor dem Aufruf und danach und verwende auch einen passenden Index.
 
Zuletzt bearbeitet:
Man könnte jetzt einwenden, dass der Test zu viel testet, aber das geht wohl an der Problematik der TE vorbei.
Das ist ein guter & richtiger Einwand, denn das Ergebnis des Tests hängt auch von der richtigen Funktionsweise der Worker Klasse ab.

Aber ohne die Möglichkeit Mocks zu verwenden wird jeder test früher oder später zu viel testen (und mutiert ganz schnell zum Integrationstests).

Außerdem ist er so nicht unabhängig von der Ausführungsreihenfolge, da du das Objekt enterprise nicht selbst anlegst. Ist die Liste wirklich vorher leer?

Falls sich das nicht vermeiden lässt, ermittle die Größe vor dem Aufruf und danach und verwende auch einen passenden Index.
Bevor man anfängt den index zu berechnen weil das Enterprise Objekt von mehreren Tests verwendet wird, sollte man lieber sicherstellen dass das Enterprise Objekt für jeden Test neu erstellt wird, "shared fixtures" sind ein Problem bei isolierten Unittests (und nciht nur da), setUp bzw. @Before bieten sich dafür an, oder im test ein neues Enterprise Objekt anlegen.
Sonst testen man nämlich auch zuviel 😉
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben