Передать список объектов в Mock mvc с помощью JUint5 - PullRequest
1 голос
/ 02 марта 2020

Я использую JUnit5 для тестирования интеграции. У меня есть список объектов, которые необходимо передать в конечную точку. Параметр содержимого Mock mvc принимает только строку. Как я могу передать этот объект? Любая идея будет принята с благодарностью.

Вот мой код

    Customer cust1 = Customer.builder().name("Syed")
            .location("India").build();
Customer cust2 = Customer.builder().name("Ali")
            .location("India").build();


    List<Customer> customers = Arrays.asList(cust1, cust2); --> This needs to be passed. 

    MvcResult result = mockMvc.perform(MockMvcRequestBuilders.post("/process")

            .content(customers) --> Compilation error here
            .contentType(MediaType.APPLICATION_JSON)
            .accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andReturn();

Как я могу ее решить

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Вы можете автоматически связать ObjectMapper и преобразовать ваш объект (customers) в строку:

@Autowired
private ObjectMapper;

// in your method
.content(objectMapper.writeValueAsString(customers))
// ..

Полный пример:

MvcResult result = mockMvc.perform(MockMvcRequestBuilders.post("/process")

    .content(objectMapper.writeValueAsString(customers)) // change applied
    .contentType(MediaType.APPLICATION_JSON)
    .accept(MediaType.APPLICATION_JSON))
    .andExpect(status().isOk())
    .andReturn();

Предполагается, что у вас есть jackson в вашем classpath (com.fasterxml.jackson.core:jackson-databind для ObjectMapper и Spring Boot JacksonAutoConfiguration должен создать objectMapper bean)

зависимость для maven

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.10.2</version>
</dependency>

Чтобы найти более новую версию, пожалуйста, проверка: https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind/

0 голосов
/ 02 марта 2020

Проблема в том, что метод content () ожидает JSON String или byte [] array. Вы можете использовать свой TestUtil (используя Джексона objectMapper) для макетов mvc тестов:

public final class TestUtil {

    private static final ObjectMapper mapper = createObjectMapper();

    /** MediaType for JSON UTF8 */
    public static final MediaType APPLICATION_JSON_UTF8 = MediaType.APPLICATION_JSON_UTF8;

    private static ObjectMapper createObjectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
        mapper.registerModule(new JavaTimeModule());
        return mapper;
    }

    /**
     * Convert an object to JSON byte array.
     *
     * @param object the object to convert.
     * @return the JSON byte array.
     * @throws IOException
     */
    public static byte[] convertObjectToJsonBytes(Object object) throws IOException {
        return mapper.writeValueAsBytes(object);
    }

         /**
         * Convert an object to JSON String.
         *
         * @param object the object to convert.
         * @return the JSON String.
         * @throws IOException
         */
        public static String convertObjectToJsonBytes(Object object) throws IOException {
            return mapper.writeValueAsString(object);
        }
    }

, а затем:

Customer cust1 = Customer.builder().name("Syed")
            .location("India").build();
Customer cust2 = Customer.builder().name("Ali")
            .location("India").build();

List<Customer> customers = Arrays.asList(cust1, cust2); --> This needs to be passed. 

MvcResult result = mockMvc.perform(MockMvcRequestBuilders.post("/process")
        .content(TestUtil.convertObjectToJsonBytes(customers))
        .contentType(TestUtil.APPLICATION_JSON_UTF8)
        .accept(TestUtil.APPLICATION_JSON_UTF8)
        .andExpect(status().isOk())
        .andReturn();
...