Beim Versuch, Testfälle für eine Klasse zu schreiben, deren Funktionalität mehr mit Kesselblechcode als Geschäftslogik arbeitet. Ich begann mich zu fragen, ob Unit Testing wirklich für diesen Kurs wert ist. Aber dann, wenn TDD verwendet wird, ist es ratsam, einen Test für jede Logik, die wir hinzufügen, zu schreiben.Einheit, die das Offensichtliche prüft
Als Beispiel die folgende Klasse verwendet nur DI, um Abhängigkeiten zu injizieren und Konfigurationsparameter zu erhalten, um den Ablauf der Anwendung einzurichten. Anders als bei Komponententests, wenn Abhängigkeiten korrekt injiziert werden, oder wenn beim Beenden der Befehl destroy aufgerufen wird (was das Unit-Testen des Java-CDI-Frameworks als mein eigener Code wäre), was kann ich sonst Unit-Test machen?
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.inject.Inject;
@Singleton
@Startup
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class PipsAlprConnectionRunner {
@Inject
private PipsAlprConfiguration config;
@Inject
private PipsAlprConnector connector;
@Inject
private Scheduler scheduler;
@Inject
@PipsAlprAdapterService
private ServiceStatus status;
private Timer connectorTimer = null;
@PostConstruct
public void initialized() {
status.started();
connectorTimer = scheduler.schedule(connector, 0,
1000 * config.getPollPeriodSeconds());
status.operational();
}
@PreDestroy
public void destroy() {
connectorTimer.cancel();
connector.shutdown();
status.stopped();
}
}
ich nicht in der Lage war von irgendwelchen Testszenarien zu denken TDD zu nutzen, auf der oben genannten Klasse, kam so nur mit dem Code, und jetzt frage ich mich, was genau kann ich hier Unit-Test.
Also ich glaube, dass die PipsAlprConnectionRunner-Klasse, die Sie definiert haben, tatsächlich eine Testklasse ist anders als die tatsächliche PipsAlprConnectionRunner? Und alle Objekte werden mit Mock-Implementierung über DI eingefügt? Wie wäre es mit dem Komponententest, bei dem Sie überprüfen, ob die Abhängigkeit tatsächlich injiziert wird? Aber ich glaube, dass solch ein Test nutzlos ist, da CDI-Injektion nicht während eines Unit-Testlaufs stattfindet. – Saad
Nein, der 'PipsAlprConnectionRunner' ist eigentlich dein' PipsAlprConnectionRunner'. Mockito erstellt einen und injiziert die verspotteten Abhängigkeiten hinein, das ist die Magie von @InjectMocks. Persönlich würde ich die DI nicht selbst testen, da dies das Framework effektiv testen würde (ok, wir könnten ein Argument für die Idee machen) dass wir testen, ob die richtigen Annotationen da sind). Ich würde einfach zu einem späteren Zeitpunkt noch einige Integrationstests durchführen, die ohnehin von DI abhängen und dies automatisch testen. –
Ich sehe Danke! Auch, da die Methode started() und destroy() den internen Zustand von PipsAlprConnectionRunner ändern, ist die einzige Möglichkeit, sie zu testen, die Verhaltensverifizierung und die Statusverifizierung. Aber das kann nur durch Mock-Objekte geschehen, was wäre, wenn wir nicht ein spöttisches Framework benutzen würden? Oder wie würden Menschen Unit-Tests an Objekten durchführen, deren Zustand vor dem Aufkommen von Mock-Objekten schwer zu überprüfen war? – Saad