如何创建和断言自定义对象的 Mockito 列表?

How to create and assert a Mockito list of custom object?

我正在尝试将测试用例第一个代码块简化为第二个代码块中显示的类似内容。 我有两个问题:

  1. 我可以模拟自定义对象列表吗?
  2. 我可以使用返回的对象列表中的字段断言自定义对象的模拟列表吗?

是否可以实现类似的东西?

  @Test
    public void testStudentSuccess() {
    Student st = new Student();
        st.setRollNumber("1234");
        st.setFeeAmount("1000");
        List<Student> stList = new ArrayList<Student>();
        stList.add(st);
        Map<String, Object> simpleJdbcCallResult = new HashMap<String, Object>();
        simpleJdbcCallResult.put("X_GET_DATA", stList);
        when(simpleJdbcCall.getSimpleJdbcCall(any(String.class), any(String.class), any(String.class),
                        any(String.class), any(String.class), any(String.class), any(String.class), any(String.class),
                        any(StudentRowMapper.class))).thenReturn(simpleJdbcCallResult);
        List<Student> studentList = opusPackageRepo.getPolicyStudent("123", "123");
        Student student = studentList.get(0);
        assertEquals(student.getRollNumber(), "1234");
        assertEquals(student.getFeeAmount(), "1000");
    }

像这样的事情(见评论 -> //):

@Test
    public void testStudentSuccess() {
        List<Student> stList = Mockito.mock(new ArrayList<Student>()); // 1. IS SOMTHING SIMILAR TO THIS POSSIBLE?
        Map<String, Object> simpleJdbcCallResult = new HashMap<String, Object>();
        simpleJdbcCallResult.put("X_GET_DATA", Mockito.mock(new ArrayList<Student>()));
        when(simpleJdbcCall.getSimpleJdbcCall(any(String.class), any(String.class), any(String.class),
                        any(String.class), any(String.class), any(String.class), any(String.class), any(String.class),
                        any(StudentRowMapper.class))).thenReturn(simpleJdbcCallResult);
        List<Student> studentList = opusPackageRepo.getPolicyStudent("123", "123");
        assertEquals(studentList, stList); // 2. CAN I ASSERT EQUALS A MOCK WITH A RETURNED LIST?
    }

在您的 OP 的原始测试中,您正在为 simpleJdbcCall.getSimpleJdbcCall() 创建如下预期结果:

Student st = new Student();
st.setRollNumber("1234");
st.setFeeAmount("1000");
List<Student> stList = new ArrayList<Student>();
stList.add(st);
Map<String, Object> simpleJdbcCallResult = new HashMap<String, Object>();
simpleJdbcCallResult.put("X_GET_DATA", stList); 

然后您断言结果(opusPackageRepo.getPolicyStudent() 必须通过 "X_GET_DATA" 键访问)符合您的期望:

Student student = studentList.get(0);
assertEquals(student.getRollNumber(), "1234");
assertEquals(student.getFeeAmount(), "1000");

你可以简化这个而不需要考虑模拟...

List<Student> expected = new ArrayList<Student>();
Map<String, Object> simpleJdbcCallResult = new HashMap<String, Object>();
simpleJdbcCallResult.put("X_GET_DATA", expected);

...

List<Student> actual = opusPackageRepo.getPolicyStudent("123", "123");
assertSame(expected, actual);

这验证 getPolicyStudent 返回的结果与 simpleJdbcCall.getSimpleJdbcCall() 调用返回的列表相同

您的测试不需要知道此列表的内容,因为您的测试只关心验证 simpleJdbcCall.getSimpleJdbcCall() 返回的列表是否被 getPolicyStudent 正确传递键:"X_GET_DATA"。我 认为 这就是你在写 "simplify a test case" 时所暗示的,它很容易完成,但不需要任何模拟。