0

私は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 を使用することに制限はありますか、それとも間違って使用していますか? それらを使用する正しい方法は何ですか?

これが単体テストの間違った手法である可能性もあります。この場合、メソッド呼び出しの結果が特定の配列にあるかどうかを検証するテストを作成する適切な方法は何ですか?

4

2 に答える 2

4

メソッドの呼び出しの前、さらには前にJUnitParamsRunnerランナーがテスト用のパラメーターを収集する(つまり、メソッドを呼び出す)ため、テストは機能しません。したがって、その時点では null です。そのため、 null 要素で構成されています。 解決策は、メソッド内で初期化することです。 また、ここでmockitoを取り除くことができると思います. POJO のように見え、POJO をモックする必要はありません。このような場合は、インスタンスを作成して必要なデータを入力するだけです。getConstraints@Before@BeforeClassclassroomAclassroomBsuitableClassrooms
classroomAclassroomBgetConstraints()

ClassroomClassroom

于 2016-03-25T12:28:10.763 に答える