Рубрики
Без рубрики

Как выполнить модульное тестирование пользовательской конечной точки привода

Ранее я опубликовал статью “Как создать пользовательскую конечную точку для мониторинга Jira”, это вторая часть, с… С тегом spring boot, привод, java, тест.

Ранее я опубликовал статью “Как создать пользовательскую конечную точку для мониторинга 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}");

        HttpResponse mockResponse = 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”