JUnit — протестируйте HTTPClient с помощью Maven Project

Опубликовано: 19 Февраля, 2023

HTTP-клиент может предоставлять синхронные и асинхронные механизмы запросов через следующие три основных класса:

  • HttpRequest: запрос, который необходимо отправить через HttpClient.
  • HttpClient: это контейнер для нескольких запросов.
  • HttpResponse: все запросы должны завершить цикл и предоставить результат в виде HttpResponse. Каждый ответ идентифицируется кодами состояния, такими как
200 -> Response obtained and it is OK means everything is correct
404 -> Requested page or element not available in the mentioned URL
401 -> Unauthorized

В этом руководстве мы рассмотрим некоторые способы тестирования httpClient, содержащего заголовки и SSL.

Пример проекта

Структура проекта:

Поскольку это проект maven, зависимости добавляются в pom.xml.

XML




<?xml version="1.0" encoding="UTF-8"?>
    xsi:schemaLocation="https://maven.apache.org/POM/4.0.0
                        https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <artifactId>httpclient-sampletesting</artifactId>
    <version>0.1-SNAPSHOT</version>
    <name>httpclient-sampletesting</name>
    <packaging>war</packaging>
  
    <parent>
        <groupId>com.gfg</groupId>
        <artifactId>parent-spring-5</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../parent-spring-5</relativePath>
    </parent>
  
    <dependencies>
         
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpcore</artifactId>
            <version>${httpcore.version}</version>
            <exclusions>
                <exclusion>
                    <artifactId>commons-logging</artifactId>
                    <groupId>commons-logging</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- utils -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>${commons-lang3.version}</version>
        </dependency>
        <!-- http client -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>${httpclient.version}</version>
            <exclusions>
                <exclusion>
                    <artifactId>commons-logging</artifactId>
                    <groupId>commons-logging</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>fluent-hc</artifactId>
            <version>${httpclient.version}</version>
            <exclusions>
                <exclusion>
                    <artifactId>commons-logging</artifactId>
                    <groupId>commons-logging</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpmime</artifactId>
            <version>${httpclient.version}</version>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>${commons-codec.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpasyncclient</artifactId>
            <version>${httpasyncclient.version}</version>
            <exclusions>
                <exclusion>
                    <artifactId>commons-logging</artifactId>
                    <groupId>commons-logging</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.github.tomakehurst</groupId>
            <artifactId>wiremock</artifactId>
            <version>${wiremock.version}</version>
            <scope>test</scope>
        </dependency>
        <!-- web -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>${javax.servlet-api.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>${jstl.version}</version>
            <scope>runtime</scope>
        </dependency>
         
    </dependencies>
  
    <build>
        <finalName>httpclient-simple</finalName>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>${maven-war-plugin.version}</version>
            </plugin>
             
            <!-- This should be added to overcome Could not initialize
                  class org.apache.maven.plugin.war.util.WebappStructureSerializer -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.3.2</version>
            </plugin>
        </plugins>
    </build>
  
    <profiles>
        <profile>
            <id>live</id>
            <build>
                <plugins>
  
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-surefire-plugin</artifactId>
                        <executions>
                            <execution>
                                <phase>integration-test</phase>
                                <goals>
                                    <goal>test</goal>
                                </goals>
                                <configuration>
                                    <excludes>
                                        <exclude>none</exclude>
                                    </excludes>
  
    
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
  
    <properties>
        <!-- util -->
        <commons-codec.version>1.10</commons-codec.version>
        <httpasyncclient.version>4.1.4</httpasyncclient.version>
        <!-- testing -->
        <wiremock.version>2.5.1</wiremock.version>
        <httpcore.version>4.4.11</httpcore.version>
        <httpclient.version>4.5.8</httpclient.version>
        <!-- maven plugins -->
        <cargo-maven2-plugin.version>1.6.1</cargo-maven2-plugin.version>
    </properties>
  
</project>

Начиная с HttpClient 4.3, запросы можно создавать с помощью RequestBuilder. Заголовок HTTP можно добавить, как указано в приведенных ниже строках кода. Пример создания RequestBuilder и использования с типом контента

Java




CloseableHttpClient httpClient = HttpClients.custom().build();
final HttpGet request = new HttpGet(GFG_URL);
request.setHeader(HttpHeaders.CONTENT_TYPE, "application/json");
httpResponse = httpClient.execute(request);

До HttpClient 4.3 нам нужно было полагаться на приведенный ниже код. Любой пользовательский заголовок может быть установлен в запросе простым вызовом setHeader в запросе:

Java




HttpClient httpClient = new DefaultHttpClient();
HttpGet getRequest = new HttpGet(GFG_URL);
request.setHeader(HttpHeaders.CONTENT_TYPE, "application/json");
httpClient.execute(getRequest);

Давайте посмотрим весь тестовый код Java для версий, начиная с HttpClient версии 4.3 и выше. Давайте проверим ResponseUtil.java, поскольку он используется

ResponseUtil.java

Java




import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import java.io.IOException;
  
public final class ResponseUtil {
    private ResponseUtil() {
    }
  
    public static void closeResponse(CloseableHttpResponse response) throws IOException {
        if (response == null) {
            return;
        }
  
        try {
            final HttpEntity entity = response.getEntity();
            if (entity != null) {
                entity.getContent().close();
            }
        } finally {
            response.close();
        }
    }
}

SampleHttpClientHeadersUnitTest.java

Здесь мы передаем URL-адрес «GeeksforGeeks» в качестве запроса, используя заголовки.

Java




import com.google.common.collect.Lists;
import org.apache.http.Header;