Migration Deep Dive für 20 · HTTP-Client und Webtest öffnen →
⌂ ÜbersichtAlle Vergleiche
Modul 20 · 100 % Codeabdeckung

HTTP-Client und Webtest

Vollständiger Legacy-Modern-Vergleich aller Java-Klassen, Tests, Maven-POMs und relevanten Ressourcen dieses Moduls. Jede Datei ist genau einmal einer fachlich passenden Vergleichsgruppe zugeordnet.

3Legacy-Dateien
5Modern-Dateien
63 → 90Codezeilen
9/9vollständig erfasst

Fachliche Einordnung

Legacy

URL-Verbindung direkt im Fachcode

Netzwerkzugriff und Auswertung sind eng gekoppelt; Tests können schwer isoliert werden.

Modern

HttpClient hinter TextTransport-Port

Java HttpClient ist ein Adapter; der Service hängt nur von einem kleinen TextTransport-Port ab.

Vergleichsfokus: Alle Dateien werden nach technischer Rolle und fachlicher Verantwortung gruppiert.
Wichtige Abgrenzung: One-to-many-Änderungen werden als Gruppe dargestellt; eine künstliche 1:1-Zuordnung wird vermieden.

Vollständige Abdeckungsmatrix

Die Ähnlichkeit ist eine technische Orientierung auf normalisiertem Quelltext. Sie ersetzt keine fachliche Bewertung.

VergleichsgruppeLegacy-DateienModern-DateienLegacy-ZeilenModern-ZeilenÄhnlichkeit
Build-Konfiguration113434100%
HTTP-Transport12182625%
Use-Case und Test1211307%

Gemeinsame Modulstruktur

Das Pair-POM bindet die Legacy- und Modern-Submodule zusammen und gehört deshalb ebenfalls zur vollständigen Codeabdeckung.

Gemeinsam · 19 Zeilenpom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>at.aydin.academy</groupId>
        <artifactId>java-modernization-deep-dive</artifactId>
        <version>1.0.0</version>
        <relativePath>../../pom.xml</relativePath>
    </parent>
    <artifactId>20httpclienttesting-pair</artifactId>
    <packaging>pom</packaging>
    <name>HTTP-Client und Webtest: Legacy und Modern</name>
    <modules>
        <module>legacy</module>
        <module>modern</module>
    </modules>
</project>

Alle semantischen Codevergleiche

01Build-KonfigurationDirektvergleich · Legacy 34 / Modern 34 Zeilen · Ähnlichkeit 100%

HTTP-Client- und Testabhängigkeiten werden verglichen.

Legacy-DateienModern-DateienEinordnung
pom.xmlpom.xmlDirektvergleich
Semantische Ähnlichkeit: 100%

Legacy

Legacy · 34 Zeilenlegacy/pom.xml
<?xml version="1.0" encoding="UTF-8"?>
        <project xmlns="http://maven.apache.org/POM/4.0.0"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>
            <parent>
                <groupId>at.aydin.academy</groupId>
                <artifactId>20httpclienttesting-pair</artifactId>
                <version>1.0.0</version>
                <relativePath>../pom.xml</relativePath>
            </parent>
            <artifactId>http-client-legacy</artifactId>
            <packaging>jar</packaging>
            <name>HTTP Client Legacy</name>

            <dependencies>

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <scope>test</scope>
</dependency>

            </dependencies>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                    </plugin>

                </plugins>
            </build>
        </project>

Modern

Modern · 34 Zeilenmodern/pom.xml
<?xml version="1.0" encoding="UTF-8"?>
        <project xmlns="http://maven.apache.org/POM/4.0.0"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>
            <parent>
                <groupId>at.aydin.academy</groupId>
                <artifactId>20httpclienttesting-pair</artifactId>
                <version>1.0.0</version>
                <relativePath>../pom.xml</relativePath>
            </parent>
            <artifactId>http-client-modern</artifactId>
            <packaging>jar</packaging>
            <name>HTTP Client Modern</name>

            <dependencies>

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <scope>test</scope>
</dependency>

            </dependencies>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                    </plugin>

                </plugins>
            </build>
        </project>
02HTTP-TransportDirektvergleich · Legacy 18 / Modern 26 Zeilen · Ähnlichkeit 25%

Direkter Clientzugriff wird hinter einem Port gekapselt.

Legacy-DateienModern-DateienEinordnung
LegacyHttpClient.javaTextTransport.java
JavaHttpTransport.java
Direktvergleich
Semantische Ähnlichkeit: 25%

Legacy

package at.aydin.lab.http.legacy;

// Design Pattern: Adapter – kapselt HttpURLConnection hinter einer kleinen Client-API.
import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;

public final class LegacyHttpClient {
    public String get(String url) throws IOException {
        HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
        connection.setRequestMethod("GET");
        try (InputStream in = connection.getInputStream()) {
            return new String(in.readAllBytes(), StandardCharsets.UTF_8);
        } finally {
            connection.disconnect();
        }
    }
}

Modern

package at.aydin.lab.http.modern;

import java.net.URI;

// Design Pattern: Port
// Zweck: HTTP-Transport wird für Tests und alternative Implementierungen austauschbar.
@FunctionalInterface
public interface TextTransport {
    String get(URI uri) throws Exception;
}
package at.aydin.lab.http.modern;

import java.net.*;
import java.net.http.*;
import java.nio.charset.StandardCharsets;
import java.time.Duration;

// Design Pattern: Adapter
// Zweck: Adaptiert java.net.http.HttpClient an den fachlichen TextTransport-Port.
public final class JavaHttpTransport implements TextTransport {
    private final HttpClient client = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(5)).build();
    public String get(URI uri) throws Exception {
        HttpRequest request = HttpRequest.newBuilder(uri).timeout(Duration.ofSeconds(10)).GET().build();
        return client.send(request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)).body();
    }
}
03Use-Case und TestDirektvergleich · Legacy 11 / Modern 30 Zeilen · Ähnlichkeit 7%

Netzwerkabhängiger Test wird durch testbaren Service mit Fake/Stub-Transport ersetzt.

Legacy-DateienModern-DateienEinordnung
LegacyHttpClientTest.javaPageTitleService.java
PageTitleServiceTest.java
Direktvergleich
Semantische Ähnlichkeit: 7%

Legacy

package at.aydin.lab.http.legacy;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertThrows;

class LegacyHttpClientTest {
    @Test
    void rejectsMalformedUrl() {
        assertThrows(Exception.class, () -> new LegacyHttpClient().get("not a url"));
    }
}

Modern

package at.aydin.lab.http.modern;

import java.net.URI;
import java.util.regex.*;

public final class PageTitleService {
    private static final Pattern TITLE = Pattern.compile("<title>(.*?)</title>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
    private final TextTransport transport;
    public PageTitleService(TextTransport transport) {
        this.transport = transport;
    }

    public String title(URI uri) throws Exception {
        Matcher m = TITLE.matcher(transport.get(uri));
        return m.find() ? m.group(1).trim() : "";
    }
}
package at.aydin.lab.http.modern;

import org.junit.jupiter.api.Test;
import java.net.URI;
import static org.junit.jupiter.api.Assertions.assertEquals;

class PageTitleServiceTest {
    @Test
    void testsWithoutNetwork() throws Exception {
        TextTransport fake = uri -> "<html><title>Testseite</title></html>";
        assertEquals("Testseite", new PageTitleService(fake).title(URI.create("https://example.invalid")));
    }
}
⌂ Cockpit