«Не найдено преобразователя для возвращаемого значения» при выполнении теста Spring Boot Mock Mvc - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь создать Mock Mvc тест контроллера Spring Boot. Я специально не хочу, чтобы весь контекст приложения запускался, поэтому я ограничиваю контекст соответствующим контроллером. Однако тест завершается неудачно с 500 со следующим выводом журнала:

2020-03-03 13:04:06.904  WARN 8207 --- [           main] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return value of type: class main.endpoints.ResponseDto]

Похоже, что контекст Spring Boot не знает, как найти Джексона.

Вот контроллер

@RestController
class MyController {
    @GetMapping("/endpoint")
    fun endpoint(): ResponseDto {
        return ResponseDto(data = "Some data")
    }
}

data class ResponseDto(val data: String)

Тест выглядит следующим образом:

@SpringBootTest(
    classes = [MyController::class],
    webEnvironment = SpringBootTest.WebEnvironment.MOCK
)
@AutoConfigureMockMvc
internal class MyControllerTest(@Autowired private val mockMvc: MockMvc) {
    @Test
    fun `should work`() {
        mockMvc.perform(MockMvcRequestBuilders.get("/endpoint").accept(MediaType.APPLICATION_JSON))
            .andExpect(
                content().json(
                    """
                        {
                            "data": "Some data"
                        }
                    """
                )
            )
    }
}

Файл build.gradle включает следующие зависимости:

    def jacksonVersion = "2.10.2"
    testImplementation("com.fasterxml.jackson.core:jackson-core:2.10.2")
    testImplementation("com.fasterxml.jackson.core:jackson-databind:2.10.2")
    testImplementation("com.fasterxml.jackson.core:jackson-annotations:2.10.2")

Любые идеи о том, как заставить это работать

Ответы [ 2 ]

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

Решение состоит в том, чтобы пометить класс @WebMvcTest вместо @SpringBootTest. Это настраивает достаточно контекста, чтобы тест мог взаимодействовать через контроллер с помощью MockMvc.

К сожалению, включение @WebMvcTest имеет другой побочный эффект: все компоненты, указанные в конфигурации с помощью @Bean -аннотированных методов, также создаются , Это проблема, когда эти методы не могут быть выполнены в тестовой среде (например, потому что они обращаются к определенным переменным среды).

Чтобы решить эту проблему, я добавил аннотацию @ActiveProfiles("test") к тесту и @Profile("!test") к каждой такой аннотированный метод. Это подавляет вызов этих методов и тестовых работ.

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

Я не уверен, но я думаю, что вам нужно указать формат вывода. Так что-то вроде

@GetMapping(value = ["/endpoint"], produces = [MediaType.APPLICATION_JSON])

Так что Spring знает, чтобы преобразовать его в json и не говорить XML или что-то еще.

...