как создать RestController в тестовой директории для приложения SpringBoot - PullRequest
0 голосов
/ 19 февраля 2019

Я сейчас пишу интеграционный тест для приложения SpringBoot.Его функциональность - получать / отправлять запросы извне и пересылать / получать их в другое приложение (APP_2).Таким образом, существует две системы, которые необходимо смоделировать вне системы и APP_2.

ProjectStructure

HomeController

@Controller
public class HomeController {
    @Autowired
    ForwardController forwardController;

    @RequestMapping("/")
    public @ResponseBody
    String greeting() {
    return forwardController.processGET().toString();
    }
}

ForwardController

@Service
public class ForwardController {
    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private Environment environment;

    private ResponseEntity sendRequest(String url, HttpMethod method, HttpEntity requestEntity, Class responseType, Object... uriVariables) {
    return restTemplate.exchange( url,  method, requestEntity,  responseType,uriVariables);
    }

    public ResponseEntity processGET()
    {
        HttpHeaders headers = new HttpHeaders();
        headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);

        HttpEntity<?> entity = new HttpEntity<>(headers);
        String app_2_url = environment.getProperty(Constants.APP_2_URL);
        ResponseEntity<String> response = sendRequest(app_2_url,HttpMethod.GET,entity,String.class);
        return response;
    }
}

APP_2_CONTROLLER

@Controller
public class App_2_Controller {

    @RequestMapping("/app2Stub")
    public @ResponseBody
    String greeting() {
        return "Hello End of world";
    }
}

Тестовый класс, который имитирует поведение внешнего запроса к системе:

HTTP_request_Test

@RunWith(SpringRunner.class)
@ActiveProfiles("test")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,classes = Application.class)
public class HttpRequestTest {

    @LocalServerPort
    private int port;

    @Autowired
    private TestRestTemplate restTemplate;

    @Autowired
    private Environment environment;

    @Test
    public void greetingShouldReturnDefaultMessage() throws Exception {
      assertThat(this.restTemplate.getForObject("http://localhost:" + port + "/",
            String.class)).contains("Hello End of world");
    }
}

Здесь, в этом тестовом классе, я переопределяю свойства, имея два файла свойств.Поэтому, когда мы запустим тест, запрос будет отправлен в App_2_Controller (Mock in my project), а не в настоящее приложение.

ВОПРОС :

  1. Есть ли способ поместить APP_2_CONTROLLER в тестовую папку?Это связано с тем, что я не хочу показывать нежелательную конечную точку теста в моем приложении Actual.
  2. Здесь, в приведенном выше проекте, я изменяю URL со свойствами.Есть ли лучший способ поставить контроллер для того же URL.Для простоты предположим, что app_2 url равен app.com: 9000 / serve

1 Ответ

0 голосов
/ 19 февраля 2019

Spring уже поставляется с MockRestServiceServer, что делает это намного проще, так что вам не нужно создавать свои собственные фиктивные контроллеры (App_2_Controller).Таким образом, в вашем случае вы можете удалить этот контроллер и написать такой тест для ForwardController:

@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("test")
public class ForwardControllerTest {
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private ForwardController forwardController; // Your service

    private MockRestServiceServer server;

    @Before
    public void setUp() {
        server = MockRestServiceServer.bindTo(restTemplate).build();
    }

    @Test
    public void processGet_returnsResponseFromAPI() {
        server.expect(once(), requestTo("http://app.com:9000/serve"))
            .andExpect(method(HttpMethod.GET))
            .andRespond(withSuccess("Hello End of world", MediaType.TEXT_PLAIN));
        assertThat(forwardController.processGET().getBody()).isEqualTo("Hello End of world"));
    }
}

Кроме того, вы можете создать отдельный тест для вашего фактического контроллера (ForwardController это простоservice), макет ForwardController и использование MockMvc:

@RunWith(SpringRunner.class)
@WebMvcTest
public class HomeControllerTest {
    @Autowired
    private HomeController homeController;
    @Autowired
    private MockMvc mockMvc;
    @MockBean
    private ForwardController forwardController;

    @Test
    public void greeting_usesForwardController() {
        when(forwardController.expectGET()).thenReturn("Hello End of world");
        mockMvc.perform(get("/"))
            .andExpect(status().isOk())
            .andExpect(content().string(containsString("Hello End of world")));
    }
}

В этом случае вы получите два теста:

  1. Один тест для проверки того, что RestTemplate используется для получения правильного ответа от вашего внешнего REST API.
  2. Другой тест для проверки того, что HomeController просто перенаправляет все, что ForwardController отвечает.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...