2016-12-23 3 views
0

Ich schreibe Komponententest für meinen Service (ClassUnderTest) Klasse. Ich verwende @Mock für alle Datenmitglieder.Vorteile von InjectMocks für ClassUnderTest

Nun, um die ClassUnderTest zu testen, muss ich ein Objekt für die ClassUnderTest erstellen.

Ich habe zwei Optionen, Erstellen Sie ein neues Objekt für ClassUnderTest und senden Sie die Mocks im Konstruktor.

Oder verwenden Sie die @InjectMocks Annotation für die ClassUnderTest.

Ich frage mich, sind die beiden Ansätze gleich oder sind sie einige Aufmerksamkeitsvorteile der Verwendung von @InjectMocks?

@Mock 
private NodeLaunchWorkflowService nodeLaunchWorkflowService; 

@InjectMocks 
private NodeLaunchWorkflowController nodeLaunchWorkflowController; 

oder

@Mock 
private NodeLaunchWorkflowService nodeLaunchWorkflowService; 

private NodeLaunchWorkflowController nodeLaunchWorkflowController; 
@Before 
public void setUp() throws JSONException { 
    MockitoAnnotations.initMocks(this); 
    nodeLaunchWorkflowController = new NodeLaunchWorkflowController(nodeLaunchWorkflowService) 
} 

Antwort

1

Es ist ganz im Gegenteil: Es gibt einigen klaren Vorteil ist eher das Konstruktor Muster zu verwenden als @InjectMocks. Insbesondere gibt es, wie die @InjectMocks documentation und other articles, eine große Vielzahl von Gründen, warum Mockito im Stillen keine Mocks injizieren kann. Dies bedeutet, dass unschuldig wirkende Klassenänderungen zu obskuren Fehlern in Ihrem Test führen können, im Gegensatz zu den klaren Kompilierungsfehlern, die ein Konstruktoraufruf verursachen würde.

Mit bestimmten automatischen Refactoring-Tools können Sie Ihre Klasse möglicherweise sogar so ändern, dass sich der Test auch automatisch und automatisch ändert. Es wird nicht mit @InjectMocks, was den Konstruktor Aufruf tief in Mockito macht.

@InjectMocks kann für eine sehr schnelle Unit-Testabdeckung in Legacy-Code nützlich sein, aber in der Neuentwicklung ist es normalerweise viel besser, Ihre Komponenten leicht testbar zu strukturieren (z. B. mit exponierten Konstruktoraufrufen) und sie dann zu testen mit klaren Anrufen.