Весеннее тестирование - тестовая конечная точка с макетом контроллера
У меня есть существующее приложение, для которого я пытаюсь написать модульные тесты... Нет реального слоя обслуживания. Идет контроллер-> репозиторий-> база данных, а конечные точки определяются через аннотации на контроллере. Я использую Spring Boot 1.3.8 (не 1.4).
То, что я хочу сделать, это заставить контроллер вернуть поддельную коллекцию, которую я могу проверить. Что происходит INSTEAD, так это приложение, которое загружается и загружаются реальные данные, а когда я вызываю конечную точку, возвращаются реальные данные приложения. Итак, кажется, у меня есть 2 проблемы: я делаю настройку данных и конфигурацию, которую я не хочу выполнять в модульном тесте, и, во-вторых, мой фиктивный контроллер игнорируется. Они, вероятно, связаны. Любая помощь приветствуется. Благодарю.
@Autowired
private WebApplicationContext context;
private MockMvc mockMvc;
@Mock
private ApplicationController applicationController = new ApplicationController();
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
}
@Test
public void contextLoads() {}
@Test
public void testEndPoints() throws Exception {
Application testApp = TestUtils.generateApplication();
Mockito.when(applicationController.getApplications()).thenReturn(Arrays.asList(testApp));
log.info("Verifying applications endpoint is up and running.");
mockMvc.perform(get("/applications/")).andExpect(status().isOk())
.andDo(print())
.andExpect(content().contentType(TestUtils.APPLICATION_JSON_UTF8))
.andExpect(jsonPath("$.[0].name",is("my_name")));
}
1 ответ
Обычно в таком случае фиктивное хранилище внедряется в контроллер, так что вы можете смоделировать метод в хранилище, иметь нужную коллекцию, выполнить некоторую обработку внутри контроллера и вернуть измененную коллекцию. Затем ваш модульный тест проверяет, что эта обработанная коллекция соответствует ожиданиям.
Что-то вроде:
@Autowired
private ApplicationRepository applicationRepository;
@Autowired
private WebApplicationContext context;
private MockMvc mockMvc;
@InjectMocks
private ApplicationController applicationController;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
when(applicationRepository.findAllByIds(anyListOf(Long.class))
.thenReturn(<the collection you want to be processed by controller>);
}