2015-08-28 9 views
5

Ich habe ein Problem, in dem die Feld-Injektion passend für Mockito @Mock Annotation für @InjectMocks funktioniert nicht in dem Fall, wo es 2 @Mock s des gleichen Typs sind. Ich habe die @Mock (name = "name_of_var") Syntax als auch verwendet, aber es noch immer nicht ...Warum kann ich den @InjectMocks-Feldvergleich bei der Ausführung mit PowerMockRunner nicht verwenden?

Hier ist die Klasse unter Test:

import java.util.Date; 
    public class Parent{ 

    private Date dateA; 
    private Date dateB; 

    public void setDateA(Date _dateA){ 
     dateA = _dateA; 
    } 

    public void setDateB(Date _dateB){ 
     dateB = _dateB; 
    } 

    public Date getDateA(){ 
     return dateA; 
    } 

    public Date getDateB(){ 
     return dateB; 
    } 

Hier ist der Test selbst:

@RunWith(PowerMockRunner.class) 
    @PrepareForTest({System.class, Parent.class}) 
    public class testParent{ 

    @Mock (name = "dateB") private Date someOtherDate; 
    @Mock (name = "dateA") private Date someDate;  

    @InjectMocks Parent p; 

    @Before 
    public void setup(){ 
     Mockito.when(someOtherDate.getTime()).thenReturn(500l); 
     PowerMockito.mockStatic(System.class); 
     PowerMockito.when(System.currentTimeMillis()).thenReturn(2000l); 
    } 

    @Test 
    public void testGetDateAGetTimeShouldReturn1000() { 
     Mockito.when(someDate.getTime()).thenReturn(1000l); 
     Date result = p.getDateA(); 
     assertEquals(1000l, result.getTime()); 
    } 

    @Test 
    public void testGetDateBGetTimeShouldReturn500() { 
     Date result = p.getDateB(); 
     assertEquals(500l, result.getTime()); 
    } 

Wenn getestet , beide assertEquals verursachen eine NullPointerException aufgrund der Tatsache, dass die @InjectMocks nicht funktioniert.

Jetzt, als ich @RunWith(PowerMockRunner.class) durch @RunWith(MockitoJUnitRunner.class) ersetzte, funktioniert es gut. Auch

, wenn ich nur 1 Date Variable definiert hatte (etwa dateA) in Parent.java und eine passende mock zu injizieren in ParentTest, wäre es zu injizieren ganz gut PowerMockRunner.class verwenden.

Der Grund, warum ich mit PowerMockRunner.class laufen muss, ist, weil ich in der Lage sein muss, statische Funktionen sowie Konstruktoren zu verspotten.

Ich bin mit Junit4.12, Mockito-all-1.10.19 und PowerMock-Mockito-1.6.2-voll.

Hat jemand die Ursache dafür, warum es nicht richtig mit PowerMockRunner.class injiziert? Gibt es eine Problemumgehung während der Ausführung mit PowerMockRunner.class?

Antwort

4

Wenn Sie PowerMockRunner verwenden möchten, müssen Sie MockitoAnnotations.initMocks() aufrufen, um die Mocks zu initialisieren, die mit den Anmerkungen erstellt werden.

Es gibt jedoch mehrere gute Gründe, InjectMocks überhaupt nicht zu verwenden. Im Allgemeinen haben Sie weniger Kontrolle darüber, wie Ihr Test aufgebaut ist. Rufen Sie einfach new an und übergeben Sie die Argumente manuell. Auch wenn es irgendein Problem gibt, wird Mockito einfach im Stillen versagen. See more in this article:

Mockito werden versuchen, spottet durch Konstruktor Injektion, Setter Injektion oder Eigenschaft Injektion in Ordnung und wie unten beschrieben, nur entweder zu injizieren. Wenn eine der folgenden Strategien fehlschlägt, meldet Mockito keinen Fehler. Das heißt, Sie müssen selbst Abhängigkeiten bereitstellen.