Es wird oft gesagt, dass Schreibeinheit Tests nur eine einzige Klasse testen und alle Mitarbeiter verspotten. Ich versuche, TDD zu lernen, um meinen Codeentwurf besser zu machen, und jetzt bin ich mit einer Situation fest, in der diese Regel gebrochen werden sollte. Oder sollte es nicht?Wie testen Sie, ob das Objekt korrekt erstellt wird, während Sie die zu testende Klasse isoliert halten?
Ein Beispiel: Klasse unter Test eine Methode, die ein Person
erhält, erzeugt ein Employee
basierend auf den Person
und gibt die Employee
.
public class EmployeeManager {
private DataMiner dataMiner;
public Employee getCoolestEmployee() {
Person dankestPerson = dataMiner.getDankestPerson();
Employee employee = new Employee();
employee.setName(dankestPerson.getName() + "bug in my code");
return employee;
}
// ...
}
Sollte Employee
ein Kollaborateur angesehen werden? Wenn nicht, warum nicht? Wenn ja, wie prüfe ich ordnungsgemäß, ob "Mitarbeiter" korrekt erstellt wurde?
Hier ist der Test, den ich im Sinn haben (mit JUnit und Mockito):
@Test
public void coolestEmployeeShouldHaveDankestPersonsName() {
when(dataMinerMock.getDankestPerson()).thenReturn(dankPersonMock);
when(dankPersonMock.getName()).thenReturn("John Doe");
Employee coolestEmployee = employeeManager.getCoolestEmployee();
assertEquals("John Doe", coolestEmployee.getName());
}
Wie Sie sehen, ich habe coolestEmployee.getName()
verwenden - Methode der Employee
Klasse, die nicht unter Test.
Eine mögliche Lösung, die den Sinn kommt, ist die Aufgabe der Umwandlung Person
s in Employee
s auf eine neue Methode der Employee
Klasse zu extrahieren, so etwas wie
public Employee createFromPerson(Person person);
Bin ich das Problem Grübeln? Was ist der richtige Weg?
Ich kann nicht sehen, was das Problem ist. Dein Test sieht gut aus. Ja, Sie rufen die 'dankPersonMock.getName()' Methode auf. Aber es ist in Ordnung, da es Mock-Objekt ist. –
Aber ich rufe auch 'coolestEmployee.getName()' und 'coolestEmployee' ist kein Spott. Ich werde es auch in der Frage klären. –
Dennoch kann ich hier keine Probleme sehen. Für mich sieht der Test gut aus. –