Java Input/Output Tests Junit?

Hallo, 

Ich habe folgendes Problem: Ich habe eine Klasse, die die Benutzerinteraktion (Input/Output) handhabt und ich muss Junit4 Tests dafür schreiben. 

Die Klasse, die ich testen möchte, sieht in etwa so aus:

package program;
// imports
public class UserInteraction {
    private Program program;


    private UserInteraction(){
        program = new Program();
    }


    // Menu display
    private void start() {
        while (!program.getProgramStarted) {
            String input = readInput();
            switch (input) {
            case "1":
                addUser();
                break;
            case "2":
                deleteUser();
                break;
            case "3":
                // ...
            default:
                System.err.println("Unknown option");
                break;
            }
        }
    }


    private void addUser() {
        // Output
        String username = readInput();
        program.addUser(username);
        System.out.println("User " + username + "added");
    }


    private void deleteUser() {
        // Output
        String username = readInput();
        program.deleteUser(username);
        System.out.println("User " + username + "deleted");
    }


    @SuppressWarnings("resource")
    private String readInput() {
        return (new Scanner(System.in)).nextLine();
    }


    public void main(String[] args) {
        UserInteraction ui = new UserInteraction();
        ui.start();
    }


}

Die Program Klasse so:

package program;
// imports
public class Program {
    // fields
    private User currentUser;
    private List<User> user = new ArrayList<User>();
    // constructor


    public void addUser(String name) throws Exception {
        if (user.size() >= 6) {
            throw new Exception();
        }
        int newID = user.size() + 1;
        user.add(new User(name, newID));
    }


    public String[] getALlUser() {
        int counter = 0;
        String[] userArray = new String[user.size()];


        for (User s : user) {
            userArray[counter++] = s.toString();
        }
        return userArray;
    }
}

Nun möchte ich zum Beispiel testen, ob die folgende Eingabe korrekt verarbeitet wird:

1
John
=> Benutzer John hinzugefügt

Zu diesem Zweck habe ich einen Junit-Test geschrieben, der wie folgt aussieht:

package tests;


import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.PrintStream;


import org.junit.After;
import org.junit.Test;


import program.*;


public class UserInteractionTest {


    private final InputStream originalIn = System.in;
    private final PrintStream originalOut = System.out;
    private Program program;


    @After
    public void restoreStreams() {
        System.setIn(originalIn);
        System.setOut(originalOut);
    }


    @Test
    public void testCreateUser() throws Exception {
        String input = "1\nJohn\n";
        ByteArrayInputStream in = new ByteArrayInputStream(input.getBytes());
        System.setIn(in);
        ByteArrayOutputStream outContent = new ByteArrayOutputStream();
        System.setOut(new PrintStream(outContent)); // Leitet System.out um


        program = new Program();
        try {
            program.main(null);
        } finally {
            System.setIn(originalIn);
        }
        String expectedOutput = "User John added";
        assertTrue("Output not found", outContent.toString().contains(expectedOutput));
    }


}

Die Eingabe ("1\n") wird gemacht, aber danach wird keine Eingabe eingefügt, so dass der Test hängen bleibt.

Weiß jemand, wie man dieses Problem lösen kann? Oder gibt es vielleicht eine bessere Möglichkeit, die Eingabe/Ausgabe meines Java-Programms zu testen/zu überprüfen?

Vielen Dank im Voraus!

Java, Code, Eclipse, Programmiersprache
Windows 11 ignoriert DNS Einstellungen?

Hallo,

ich habe im lokalen Netz einen DNS-Server für lokale DNS-Einträge und zum Ad-Blocking. Die lokalen DNS-Einträge werden aufgelöst, wie ich es erwarte, wenn ich aber eine geblockte Domain auflöse, wird die Antwort vom internen DNS (0.0.0.0) ignoriert und die Antwort vom Backup DNS (Cloudflare) verwendet. Gibt es hier eine Einstellung, dass Windows das nicht macht?

Zur Verdeutlichung hier eine Namensauflösung einer geblockten Domain

Resolve-DnsName marketingplatform.google.com -Type A

Name                                           Type   TTL   Section    IPAddress
----                                           ----   ---   -------    ---------
marketingplatform.google.com                   A      222   Answer     142.250.184.238

Hier, wenn der DNS Server spezifisch angegeben wird

Resolve-DnsName marketingplatform.google.com -Type A -Server 10.10.10.10

Name                                           Type   TTL   Section    IPAddress
----                                           ----   ---   -------    ---------
marketingplatform.google.com                   A      60    Answer     0.0.0.0

Und hier, die DNS-Konfiguration

Get-DnsClientServerAddress -InterfaceIndex 16 -AddressFamily IPv4 | select InterfaceAlias, ServerAddresses

InterfaceAlias ServerAddresses
-------------- ---------------
Wi-Fi          {10.10.10.10, 1.1.1.1}

Vielleicht kennt ja jemand dieses Problem und kann mir weiterhelfen.

PC, Computer, Internet, Windows, WLAN, Linux, Netzwerk, IT, DNS, Windows 11, pihole
NGINX Reverse Proxy sicher konfigurieren?

Hallo,

ich habe eine grundsätzliche Frage dazu, wie man NGINX sicher als Reverse Proxy einsetzt und leider nicht wirklich was dazu im Netz gefunden.

Mal angenommen auf Server A läuft eine Webapplikation, die auf 10.0.0.1:5000 hört und auf Server B läuft mein NGINX, der auf 10.0.0.2:80/443 hört. Ich möchte also von Server A zu B einen Reverse Proxy machen und die Verbindung soll mit TLS abgesichert sein.

upstream serverA {
    server 10.0.0.1:5000;
}

server {
    server_name example.org;
    listen [::]:443 ssl ipv6only=on;
    listen 443 ssl;
    ssl_certificate /etc/ssl/certs/example.org.crt;
    ssl_certificate_key /etc/ssl/private/example.org.key;

    location / {
        proxy_pass http://serverA;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Nginx-Proxy true;
        proxy_redirect off;
    }

}

... HTTPS redirect

Aber jetzt ist doch nicht der Traffic von Server B also dem NGINX, auf den der Nutzer zugreift zu Server A, der Webapplikation verschlüsselt oder liege ich da falsch? Falls er nicht verschlüsselt ist, wie erreiche ich das? Ist hier eine einfache Firewall Regel auf Server A schon ausreichend? Im Sinne von

ufw allow in from 10.0.0.2 to any port 5000/tcp

Danke für alle Antworten

Server, Computer, Technik, Linux, Sicherheit, IT-Sicherheit, SSL, Technologie, Webserver, nginx, Spiele und Gaming
Weitere Inhalte können nur Nutzer sehen, die bei uns eingeloggt sind.