繁体   English   中英

如何在JUnitParams参数提供程序中使用Mockito存根?

[英]How to use Mockito stubs in a JUnitParams parameter provider?

我正在尝试学习JUnit。 在处理特定问题时,我决定使用JUnitParams参数提供程序。 我正在编写的测试方法的每组参数都应包含两个输入值和一个列表,将针对该列表测试方法调用的结果:

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[]{})},
    };
}

classroomAclassroomB实际上是在每次测试执行之前准备的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个对象,但进一步检查显示,所有元素均为空-我准备的存根不存在。 显然,测试在应该通过或失败的地方不会通过或失败。

在Mockito中使用JUnitParams是否有限制,还是我使用它们有误? 使用它们的正确方法是什么?

这也可能是错误的单元测试技术。 如果是这样,编写测试以验证方法调用的结果是否在给定数组中的正确方法是什么?

您的测试不起作用,因为JUnitParamsRunner在调用@Before方法之前甚至在@BeforeClass之前收集测试参数(即,调用getConstraints方法)。 因此, classroomAclassroomB为空。 这就是为什么suitableClassrooms由null元素组成的原因。
解决方案是使用getConstraints()方法初始化classroomAclassroomB getConstraints()

我也相信您可以在这里摆脱模仿。 Classroom看起来像POJO,并且没有必要模拟POJO。 在这种情况下,您只需要创建Classroom实例并将其填充必要的数据即可。

您需要让类知道您正在使用Mockito运行测试用例。 在班级添加以下内容,它应该可以正常工作。

@RunWith(MockitoJUnitRunner.class)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM