Wie zum Hohn eine private innere Klasse
Ich habe eine spring-Anwendung, und ich will zu schaffen, einen einheitlichen test auf einem controller wie dieser. Das problem ist, dass die Wrapper-Klasse ist eine private innere Klasse, also den Wrapper, wird nicht verstanden im test. Ist es möglich, zu verhöhnen, als es mit Mockito ohne änderung der controller-Klasse. Ich kann verwenden prepareData() um eine Instanz des Objekts, aber ich weiß nicht, ob dies verwendet werden könnte, um mock-Objekts.
Dank
@Controller
public class Controller {
private class Wrapper {
private Object1 field1;
private Object2 field2;
private Object1 method1(){
...
}
private Object2 method1(){
...
}
}
@ModelAttribute("data")
public Wrapper prepareData() {
return new Wrapper ();
}
public String save(@ModelAttribute("data") Wrapper wrapper, BindingResult result, Model model){
...
}
}
Also in meinem test würde ich so etwas haben
@Test
public void usernameEmpty(){
BindingResult result = Mockito.mock(BindingResult.class);
Model model = Mockito.mock(Model.class);
Wrapper data = //how to mock it
when(data.method1()).then(new Foo1());
when(data.method2()).then(new Foo2());
String returned = controller.save(data, result, model);
....
}
Meine ich Fragen, warum Sie dies tun wollen? Sie wird wahrscheinlich am Ende die Prüfung der code falsch. Wenn die innere Klasse hat Abhängigkeiten (wahrscheinlich die durch die controller?) verspotten diese. Warten? Funktioniert dein code kompilieren? Wenn Wrapper eigenen Klasse können Sie verwenden Sie es als ein argument für eine öffentliche Methode?
Fernandes ich bin neu im Test. Ich wollte nur einen test machen auf die speichern-Methode, so dass ich brauchte, um zu verspotten die Wrapper-Objekt, so könnte ich definieren, die Objekte zurückgeben, wenn einige Methoden aufgerufen werden. Ja der controller kompiliert (für Den test nicht, aber das ist ja das problem, dass ich nicht verwenden können Wrapper-Klasse im test). Vielleicht gibt es einen besseren Weg, dies zu tun.
Java nur überrascht mich wieder (auf dem negativ). Das macht mich machtlos zu helfen, ohne ein Java-compiler auf der hand 🙁 Trotzdem, auch wenn erlaubt, ich glaube nicht, es ist ein gutes design, um eine öffentliche Methode, die erfordert Kenntnisse der Soldaten. Es bricht die Kapselung. Wie verwenden Sie diese Methode in realen code? Ist es möglich?
Fernandes du hast Recht, ich denke, ich werde ändern Sie es auf öffentlichen
oder nutzen Sie meine neue Antwort 😉
Fernandes ich bin neu im Test. Ich wollte nur einen test machen auf die speichern-Methode, so dass ich brauchte, um zu verspotten die Wrapper-Objekt, so könnte ich definieren, die Objekte zurückgeben, wenn einige Methoden aufgerufen werden. Ja der controller kompiliert (für Den test nicht, aber das ist ja das problem, dass ich nicht verwenden können Wrapper-Klasse im test). Vielleicht gibt es einen besseren Weg, dies zu tun.
Java nur überrascht mich wieder (auf dem negativ). Das macht mich machtlos zu helfen, ohne ein Java-compiler auf der hand 🙁 Trotzdem, auch wenn erlaubt, ich glaube nicht, es ist ein gutes design, um eine öffentliche Methode, die erfordert Kenntnisse der Soldaten. Es bricht die Kapselung. Wie verwenden Sie diese Methode in realen code? Ist es möglich?
Fernandes du hast Recht, ich denke, ich werde ändern Sie es auf öffentlichen
oder nutzen Sie meine neue Antwort 😉
InformationsquelleAutor Javi | 2011-04-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihr test auf Methoden -, sondern es tests für die ganze Klasse Verhalten. Wenn Ihr die innere Klasse ist privat, dann ist seine eine Implementierung detail. Etwas, das der test sollte nicht wissen. Es es gibt eine Menge von Verhaltensweisen, die in das innere-Klasse, und Sie möchten, um es zu testen unabhängig vielleicht sollten Sie öffentlich machen und getrennt von dieser Klasse.
Vielleicht denken Sie: aber dann... es ist eine Menge code zu testen (eine sehr große unteilbare Sache), kann ich nicht testen, etwas kleiner? Nun... ja. Test Driven Development Mandate, um eine minimale Implementierung und weitere code hinzufügen, nur, wenn Sie fügen Sie weitere tests. So starten Sie mit einigen test-und minimal-Implementierung und entwickeln Sie beide, bis die tests haben alle der Spezifikation und der code-Implementierung.
Also keine sorgen machen private innere Klassen. Testen Sie Ihre Klasse Vertrag!
Es ist nicht sehr gut - es werden die integration zu testen. Sie brach eines der wichtigsten Prinzipien des test driven development - test sollte einfach sein!
Ja. Aber TDD ist eine Entwicklung, die Methodik: zuerst test schreiben, dann den code schreiben. In diesem Fall wird der OP vielleicht ein anderes design (eher schlicht und mehr modular), und nicht einer privaten inneren Klasse. In dieser situation ist es nur der Prüfung eines bereits existierenden code. Sagte, dass: ich bin damit einverstanden, es ist nicht ein einfacher test, sondern eine private innere Klasse ist kein Auszug aus der container-Klasse so, obwohl es nicht einfach ist, es ist nicht ein integration-test IMHO (jedenfalls, der wichtige Teil ist "test" 🙂
Ich denke nicht so. Beispiel: wenn die Datei erläutert einige Informationen, die es manchmal erfordert, internen cache, in der Regel kann es so sein, wie private innere Klasse.
InformationsquelleAutor helios