Необходимо запустить сервер Tomcat для тестового теста Junit. - PullRequest
0 голосов
/ 22 апреля 2020

Здравствуйте, я написал тестовый пример juint для остальных API, используя HttpUriRequest. Тестовый пример дает правильный результат, но проблема в том, что мне нужно запустить сервер Tomcat, чтобы протестировать тестовый случай junit. почему ??

Вот мой код:

package com.dataguise.webservices;

import static org.junit.jupiter.api.Assertions.*;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import com.dataguise.webservices.beans.DgException;


class RestAPIsTest {

    final String versionNumber = "v1";

    final String baseUrl = "http://localhost:10181/dgcontroller/services/restAPIs/";

    final String sessionId = "2";

@Test
    public void idpsTest() throws ClientProtocolException, IOException {
        HttpUriRequest request = new HttpGet(baseUrl + versionNumber + "/idps");
        request.addHeader("sessionId", sessionId);
        HttpResponse httpResponse = HttpClientBuilder.create().build().execute(request);
        System.out.println(">>>>>>>>>>>>>>>." + httpResponse.getStatusLine().getStatusCode());

        assertEquals(200, httpResponse.getStatusLine().getStatusCode());

        // Getting Json From Http Response
        String json = EntityUtils.toString(httpResponse.getEntity());
        System.out.println(">>>>>>>>>>>>>>>." + json);
    }
}

Этот тестовый пример работает нормально, но когда я останавливаю сервер, тестовый пример не выполняется , Есть ли способ проверить этот случай без запуска сервера ?? Спасибо

Ответы [ 3 ]

1 голос
/ 22 апреля 2020

Я думаю, вы неправильно поняли значение «модульных тестов». Если вы выполняете HTTP-запрос к работающему серверу, вы тестируете весь сервер, а не просто какой-то отдельный модуль.

Если вы хотите проверить logi c внутри вашего контроллера, просто создайте контроллер вручную и вызовите соответствующий метод.

0 голосов
/ 22 апреля 2020

Если вы хотите проверить свои конечные точки API, Spring предоставляет различные аннотации и различные способы тестирования приложения. Например:

  1. Вы можете запустить сервер во время тестового примера, инициализировать контекст приложения Spring, а затем протестировать API, нажав его, чтобы подтвердить результат.
  2. Вы можете просто использовать весенняя аннотация @SpringBootTest вместе с @AutoConfigureMockMvc для настройки контекста приложения без запуска сервера для тестирования приложения до конца.
  3. Еще один подход, когда вы не хотите тестировать все приложение, а просто нужно Тестирование веб-слоя заключается в использовании аннотации @WebMvcTest. В этом случае вам нужно смоделировать сервисный слой и любые другие bean-компоненты, которые могут понадобиться для получения желаемого результата.

Вы можете использовать аннотацию @SpringBootTest, чтобы сообщить Spring, что он должен запустить сервера и сконфигурируйте контекст приложения для запуска теста.

Аннотация @SpringBootTest указывает Spring Boot искать основной класс конфигурации (например, с @SpringBootApplication) и использовать его для запустите контекст приложения Spring.

В этом случае вам не нужно будет запускать сервер вручную. Spring позаботится обо всем, и как только тесты будут завершены, он также остановит сервер. я не пытался скомпилировать или запустить код, но использовал:

 @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
 public class HttpRequestTest {

    @LocalServerPort
    private int port;

    final String versionNumber = "v1";

    final String pathUrl = "/dgcontroller/services/restAPIs/";

    final String sessionId = "2";

    @Test
    public void idpsTest() throws ClientProtocolException, IOException {
        String baseUrl = "http://localhost:"+port+pathUrl;
        HttpUriRequest request = new HttpGet(baseUrl + versionNumber + "/idps");
        request.addHeader("sessionId", sessionId);
        HttpResponse httpResponse = HttpClientBuilder.create().build().execute(request);
        System.out.println(">>>>>>>>>>>>>>>." + httpResponse.getStatusLine().getStatusCode());

        assertEquals(200, httpResponse.getStatusLine().getStatusCode());

        // Getting Json From Http Response
        String json = EntityUtils.toString(httpResponse.getEntity());
        System.out.println(">>>>>>>>>>>>>>>." + json);
    }

}

Это должно работать, если в вашем pom.xml есть следующая зависимость:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
0 голосов
/ 22 апреля 2020

Сервер необходим, потому что вы проводите тестирование по URL-адресам.

Единственный способ сделать это - смоделировать сервер. Для Java существует множество различных библиотек насмешек, таких как Mockito или EasyMock, но все они позволяют вам выдавать поддельные ответы с сервера.

Из вставленного вами теста не имеет смысла Выполните такие тесты, так как вы, кажется, проверяете, что фактический сервер отвечает, и ничего не делаете с ответом. Насмешка над сервером очень полезна для тестирования клиентов API, но вы, похоже, не проверяете это.

У вас есть два варианта:

  • Проверьте функциональность внутри конечной точки с помощью модульное тестирование без участия сервера
  • Создайте несколько хуков перед интеграцией и после интеграции, которые запускают и останавливают сервер для вас во время тестирования. Это легко сделать с помощью Maven или Gradle (проверьте Запуск сервера Apache tomcat перед интеграционным тестом )
...