使用mockMvc从Spring Controller断言返回项的列表

时间:2017-01-22 17:54:36

标签: java json spring spring-mvc spring-test

我已经设置了一个Spring启动应用程序来使用Spring MVC控制器来返回一个项目列表。我有一个spring测试,它创建一个连接到Controller的模拟依赖项,然后控制器将预期的模拟项列表作为JSON数组返回。

我试图断言内容是正确的。我想声明JSON数组包含预期的列表。我认为尝试将JSON数组解释为java.util.List存在问题。有没有办法做到这一点?

然后,第一个和第二个.andExepct()传递,hastItems()检查不通过。我能做什么,我可以通过我的列表并验证它包含在JSON中?我能想到的另一种方法是将JSON转换为我的List并使用"常规java junit断言来验证它#34;

public class StudentControllerTest extends AbstractControllerTest {

@Mock
private StudentRepository mStudentRepository;

@InjectMocks
private StudentController mStudentController;

private List<Student> mStudentList;


@Before
public void setUp() {
    MockitoAnnotations.initMocks(this);

    setUp(mStudentController);

    // mock the student repository to provide a list of 3 students.
    mStudentList = new ArrayList<>();
    mStudentList.add(new Student("Egon Spengler", new Date(), "111-22-3333"));
    mStudentList.add(new Student("Peter Venkman", new Date(), "111-22-3334"));
    mStudentList.add(new Student("Raymond Stantz", new Date(), "111-22-3336"));
    mStudentList.add(new Student("Winston Zeddemore", new Date(), "111-22-3337"));

    when(mStudentRepository.getAllStudents()).thenReturn(mStudentList);
}


@Test
public void listStudents() throws Exception {
    MvcResult result =
        mockMvc.perform(get("/students/list"))
        .andDo(print())
        .andExpect(jsonPath("$", hasSize(mStudentList.size())))
        .andExpect(jsonPath("$.[*].name", hasItems("Peter Venkman", "Egon Spengler", "Raymond Stantz", "Winston Zeddemore")))

        // doesn't work
        .andExpect(jsonPath("$.[*]", hasItems(mStudentList.toArray())))
        // doesn't work
        .andExpect(jsonPath("$.[*]", hasItems(mStudentList.get(0))))

        .andExpect(status().isOk())
            .andReturn();


    String content = result.getResponse().getContentAsString();


}

}

1 个答案:

答案 0 :(得分:1)

你可以尝试这样的事情:

.andExpect(MockMvcResutMatchers.content().json(convertObjectToJsonString(mStudentList)));

你可以有一个从列表中创建 JSON 的方法:

 private String convertObjectToJsonString(List<Student> studentList) {
        try {
            ObjectMapper mapper = new ObjectMapper();
            return mapper.writeValueAsString(studentList);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            throw new RuntimeException();
        }
    }

您可以修改 convertObjectToJsonString 方法以接受 Student 对象作为参数(如果您需要一个特定元素作为响应)。