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?
Was ist dein Problem? Ausnahme? – Evgeny
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. –