У меня есть простой REST-контроллер, который я пытаюсь протестировать, тест выглядит так:
@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
public class ModelControllerTests {
private MediaType contentType = MediaType.APPLICATION_JSON_UTF8;
private HttpMessageConverter jacksonConverter;
private MockMvc mockMvc;
@Mock
private ModelService service;
@InjectMocks
private ModelController controller;
@Autowired
private WebApplicationContext context;
@Autowired
void setConverters(HttpMessageConverter<?>[] converters) {
jacksonConverter = Arrays.stream(converters)
.filter(hmc -> hmc instanceof MappingJackson2HttpMessageConverter)
.findAny()
.orElse(null);
assertNotNull(jacksonConverter);
}
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mockMvc = standaloneSetup(controller)
.build();
}
@Test
public void postModel_returnsModel() throws Exception {
when(service.doSomething(any())).thenReturn(new Model("cde", null));
mockMvc.perform(post("/model")
.content(json(new Model("abc", null)))
.contentType(contentType))
.andDo(print())
.andExpect(status().isOk())
.andExpect(content().json("{\"notEmpty\":\"abc\"}", true));
}
private String json(Object o) throws IOException {
var responseMessage = new MockHttpOutputMessage();
jacksonConverter.write(o, MediaType.APPLICATION_JSON_UTF8, responseMessage);
return responseMessage.getBodyAsString();
}
}
Теперь у меня проблема с зависимостями и конфигурацией, у меня есть следующеестрока в моем application.properties: spring.jackson.default-property-inclusion=non_null
, которая отлично работает при использовании обычного mockMvc (webAppContextSetup), однако я хотел смоделировать ModelService
(который автоматически подключается в ModelController
.
При использовании standaloneSetup
для создания экземпляра MockMvc, похоже, нет конфигурации, возвращаются поля, для которых задано значение null, и, кроме того, кажется, что ModelService, аннотированный @Mock, не совпадает с тем, что указан в ModelController, поэтому, когда postModel_returnsModel
, он использует неправильныйсервис.
Как я могу решить эту проблему?