私はJUnitを学ぼうとしています。特定の問題に取り組んでいるときに、JUnitParams パラメーター プロバイダーを使用することにしました。私が書いているテスト メソッドの各パラメータ セットには、2 つの入力値と、メソッド呼び出しの結果がテストされるリストが含まれている必要があります。
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
実際にclassroomB
は、各テスト実行前に準備された Mockito スタブです。
@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);
}
Classroom
前述のオブジェクトのリストを使用しようとすると、問題が発生します。
@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)));
}
デバッグは、最初の実行中suitableClassrooms
に 2 つのオブジェクトが含まれていることを示していますが、さらに調査すると、すべての要素が null であることが示されます。準備したスタブは存在しません。明らかに、テストは、合格または失敗するはずの場所で合格または失敗しません。
Mockito で JUnitParams を使用することに制限はありますか、それとも間違って使用していますか? それらを使用する正しい方法は何ですか?
これが単体テストの間違った手法である可能性もあります。この場合、メソッド呼び出しの結果が特定の配列にあるかどうかを検証するテストを作成する適切な方法は何ですか?