2016-03-25 2 views
0

Ich versuche JUnit zu lernen. Bei der Bearbeitung eines bestimmten Problems habe ich mich für die Verwendung von JUnitParams-Parameteranbietern entschieden. Jeder Satz von Parametern für eine Testmethode sollte ich schreibe zwei Eingabewerte enthalten und eine Liste, gegen die Ergebnisse eines Methodenaufruf getestet werden würde:Wie werden Mockito-Stubs in einem JUnitParams-Parameteranbieter verwendet?

private static final Object[] getConstraints() { 
    return new Object[]{ 
      new Object[]{15, Equipment.WHITEBOARD, Arrays.asList(new Classroom[]{classroomA, classroomB})}, 
      new Object[]{15, Equipment.PROJECTOR, Arrays.asList(new Classroom[]{classroomB})}, 
      new Object[]{15, Equipment.MICROPHONE, Arrays.asList(new Classroom[]{classroomA})}, 
      new Object[]{30, Equipment.WHITEBOARD, Arrays.asList(new Classroom[]{classroomB})}, 
      new Object[]{30, Equipment.PROJECTOR, Arrays.asList(new Classroom[]{classroomB})}, 
      new Object[]{30, Equipment.MICROPHONE, Arrays.asList(new Classroom[]{})}, 
      new Object[]{45, Equipment.WHITEBOARD, Arrays.asList(new Classroom[]{})}, 
      new Object[]{45, Equipment.PROJECTOR, Arrays.asList(new Classroom[]{})}, 
      new Object[]{45, Equipment.MICROPHONE, Arrays.asList(new Classroom[]{})}, 
    }; 
} 

classroomA und classroomB sind tatsächlich Mockito Stummel vor jeder Testausführung vorbereitet :

@Before 
public void setUp() { 
    classroomA = mock(Classroom.class); 
    classroomB = mock(Classroom.class); 
    classrooms = Arrays.asList(new Classroom[]{classroomA, classroomB}); 

    when(classroomA.getName()).thenReturn("A"); 
    when(classroomA.getCapacity()).thenReturn(20); 
    when(classroomA.getEquipment()).thenReturn(Arrays.asList(new Equipment[]{Equipment.WHITEBOARD, Equipment.MICROPHONE})); 

    when(classroomB.getName()).thenReturn("B"); 
    when(classroomB.getCapacity()).thenReturn(40); 
    when(classroomB.getEquipment()).thenReturn(Arrays.asList(new Equipment[]{Equipment.WHITEBOARD, Equipment.PROJECTOR})); 

    bookingSystem = new BookingSystem(classrooms); 
} 

Das Problem tritt auf, wenn ich versuche oben genannten Listen von Classroom Objekte zu verwenden:

@Test 
@Parameters(method = "getConstraints") 
public void shouldBookClassroomMeetingConstraints(int capacity, Equipment equipment, List<Classroom> 
     suitableClassrooms) { 
    Assert.assertTrue("Should book a classroom that has a minimum capacity of " + capacity + " and has " + 
      equipment, 
      suitableClassrooms.contains(bookingSystem.book(capacity, equipment, ANY_DAY_OF_WEEK, ANY_HOUR))); 
} 

Debugging zeigt, dass beim ersten Lauf suitableClassrooms 2 Objekte enthält, aber weitere Inspektion zeigt, dass alle Elemente null sind - die Stubs, die ich vorbereitet habe, sind nicht da. Offensichtlich bestehen die Tests nicht oder nicht, wo sie bestanden oder nicht bestanden werden sollten.

Gibt es eine Einschränkung bei der Verwendung von JUnitParams mit Mockito oder verwende ich sie falsch? Was ist der richtige Weg, sie zu benutzen?

Es ist auch möglich, dass dies eine falsche Technik des Komponententests ist. Wenn dies der Fall ist, was ist der richtige Weg, um einen Test zu schreiben, der überprüft, ob das Ergebnis eines Methodenaufrufs in einem gegebenen Array ist?

+0

Was ist dein Problem? Ausnahme? – Evgeny

+0

Mein Problem ist, dass 'appropriateClassrooms.contains (...)' Methode immer false zurückgibt, weil 'passableClassrooms' nur null Elemente hat. Mock Stubs sind aus irgendeinem Grund nicht in der Liste. –

Antwort

3

Sie Test nicht funktioniert, weil JUnitParamsRunner Läufer Parameter für Test sammelt (d ruft getConstraints-Methode) vor Aufruf von @Before Methoden und sogar vor @BeforeClass. So classroomA und classroomB sind in diesem Moment null. Deshalb besteht suitableClassrooms aus Nullelementen.
Die Lösung besteht darin, classroomA und classroomB in der getConstraints() Methode zu initialisieren.

Auch ich glaube, dass Sie hier Mockito loswerden können. Classroom sieht wie POJO aus und es ist nicht notwendig POJOs zu verspotten. In diesem Fall müssen Sie nur die Classroom Instanz erstellen und sie mit den notwendigen Daten füllen.

+0

diskutiert. Sie haben Recht. Ich initialisierte Stubs bei ihrer Deklaration: 'private static Classroom classroomA = mock (Classroom.class);' und jetzt 'passableClassrooms' enthält die Stubs und meine Tests bestanden. Was POJOs betrifft, versuche ich jetzt alles außer SUTs als Übung zu verspotten. –

-1

Sie müssen der Klasse mitteilen, dass Sie die Testfälle mit Mockito ausführen. fügen Sie unten auf der Klassenebene hinzu und es sollte funktionieren.

@RunWith(MockitoJUnitRunner.class) 
+1

Ich kann das nicht tun, weil meine Testklasse bereits mit '@RunWith (JUnitParamsRunner.class)' versehen ist. Dieses Problem wurde unter http://stackoverflow.com/questions/24431427/multiple-runwith-statements-in-junit –

Verwandte Themen