Ранее я опубликовал статью “Как создать пользовательскую конечную точку для мониторинга Jira”, это вторая часть, в которой показано, как модульно протестировать эту конечную точку с помощью SpringBoot MockMvc, Mokito и PowerMokito.
Здесь приведен список необходимых зависимостей:
implementation 'junit:junit:4.12' testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' exclude group: "com.vaadin.external.google", module:"android-json" } testImplementation group: 'com.konghq', name: 'unirest-mocks', version: '3.11.06' testImplementation group: 'org.powermock', name: 'powermock-module-junit4', version: '2.0.9' testImplementation group: 'org.powermock', name: 'powermock-api-mockito2', version: '2.0.9'
Сначала нам нужен класс, который загружает наш класс конфигурации, используемый службой соединителей Jira.
@TestConfiguration public class TestConfig { @Bean public JiraConfig getJiraConfig(){ return new JiraConfig(); } }
Протестируйте службу, чтобы убедиться, что она возвращает правильные данные в соответствии с ответом конечной точки Jira. Для этого нам нужно поиздеваться над волнениями.получить() вызов и ответ.
@RunWith(PowerMockRunner.class) @PowerMockRunnerDelegate(SpringRunner.class) @PrepareForTest(Unirest.class) @Import({TestConfig.class}) @PowerMockIgnore({"javax.*.*", "com.sun.*", "org.xml.*"}) @SpringBootTest public class JiraConnectorServiceTest { @Mock private GetRequest getRequest; @Autowired JiraConnectorService jiraConnectorService; @Autowired JiraConfig jiraConfig; @Test public void getResponseTimeTest() throws Exception { JsonNode json = new JsonNode("{\"result\":10}"); HttpResponsemockResponse = mock(HttpResponse.class); when(mockResponse.getStatus()).thenReturn(200); when(mockResponse.getBody()).thenReturn(json); String mySelfEndPointUrl = jiraConfig.getHost() + jiraConfig.getApiPath() + JiraConnectorService.JIRA_MYSELF_ENDPOINT; PowerMockito.mockStatic(Unirest.class); when(Unirest.get(mySelfEndPointUrl)).thenReturn(getRequest); when(getRequest.header(JiraConnectorService.HEADER_ACCEPT, JiraConnectorService.HEADER_APP_JSON)).thenReturn(getRequest); when(getRequest.basicAuth(jiraConfig.getUser(), jiraConfig.getPassword())).thenReturn(getRequest); when(getRequest.asJson()).thenReturn(mockResponse); ResponseTimeData data = jiraConnectorService.getResponseTime(); Assert.assertEquals(HttpStatus.OK.value(), data.getHttpStatusCode()); Assert.assertTrue(data.getTime() > 0); }
Мы должны использовать PowerMockito и @запуск с(PowerMockRunner.class) аннотация для макетирования статического метода Unirest.get(..) .
Мы можем использовать только одну @RunWith аннотацию, поэтому мы добавляем @powermockrunnerdelegate(SpringRunner.class) для загрузки контекста Spring.
Затем проверьте конечную точку:
@RunWith(SpringRunner.class) @Import({TestConfig.class}) @AutoConfigureMockMvc @SpringBootTest public class RestJiraEndPointTest { private static final String ACTUATOR_URI = "/management"; @MockBean private JiraConnectorService jiraConnectorService; @Autowired private MockMvc mockMvc; @Test public void healthDtl_DOWN() throws Exception { ResponseTimeData data = new ResponseTimeData(); data.setTime(-1); data.setHttpStatusCode(HttpStatus.SERVICE_UNAVAILABLE.value()); data.setMessage("Service unavailable"); Mockito.when(jiraConnectorService.getResponseTime()).thenReturn(data); RequestBuilder requestBuilder = MockMvcRequestBuilders.get(ACTUATOR_URI + "/jira/healthDtl") .accept(MediaType.APPLICATION_JSON); this.mockMvc.perform(requestBuilder) .andDo(MockMvcResultHandlers.print()) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$.status").value("DOWN")); } @Test public void healthDtl_UP() throws Exception { ResponseTimeData data = new ResponseTimeData(); data.setTime(235L); data.setHttpStatusCode(HttpStatus.OK.value()); data.setMessage("Ok"); Mockito.when(jiraConnectorService.getResponseTime()).thenReturn(data); RequestBuilder requestBuilder = MockMvcRequestBuilders.get(ACTUATOR_URI + "/jira/healthDtl") .accept(MediaType.APPLICATION_JSON); this.mockMvc.perform(requestBuilder) .andDo(MockMvcResultHandlers.print()) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$.status").value("UP")) .andExpect(MockMvcResultMatchers.jsonPath("$.responseTimeMs").value("235")); } }
Я впервые попытался использовать @WebMvcTest(RestJiraEndPoint.class) вместо @Springboost но безуспешно. Spring, похоже, не распознал @restcontrollerendpoint в качестве контроллера rest. Итак, вы должны использовать @Springboost и @autoconfiguremockmvc
Оригинал: “https://dev.to/mbarre/how-to-unit-test-a-custom-actuator-endpoint-3h4p”