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
Ist das schlimm wenn man ein Script/Code komplizierter schreibt als es sein könnte?

Hallo,

Ich bin Programmieranfänger und habe eine Frage bezüglich dem Titel und zwar habe ich um mehr Praxiserfahrung zu sammeln ein simplen Kalkulator für die Konsole programmiert (in Java). Dieser ist jedoch spürbar komplizierter geworden als es sein müsste.

import java.util.Objects;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        calculate();
    }
    public static void calculate() {

        System.out.println("Rechenart:");
        Scanner scanner = new Scanner(System.in);
        String arithmeticMethod = scanner.next();

        if (Objects.equals(arithmeticMethod, "addition") || Objects.equals(arithmeticMethod, "+")) {
            addition();
        } else if (Objects.equals(arithmeticMethod, "subtraction") || Objects.equals(arithmeticMethod, "-")) {
            subtraction();
        } else if (Objects.equals(arithmeticMethod, "multiplication") || Objects.equals(arithmeticMethod, "*") || Objects.equals(arithmeticMethod, "x")) {
            multiplication();
        } else if (Objects.equals(arithmeticMethod, "division") || Objects.equals(arithmeticMethod, ":") || Objects.equals(arithmeticMethod, "/")) {
            division();
        } else if (Objects.equals(arithmeticMethod, "stop")) {
            System.out.println("Program ended.");
        }
    }
    public static void addition() {

        Scanner scanner = new Scanner(System.in);

        int firstSummand;
        int secondSummand;

        System.out.println("1. Summand: ");
        firstSummand = scanner.nextInt();
        System.out.println("2. Summand: ");
        secondSummand = scanner.nextInt();
        System.out.println("Ergebnis: ");
        System.out.println(firstSummand + secondSummand);
        calculate();
    }
    public static void subtraction() {

        Scanner scanner = new Scanner(System.in);

        int minuend;
        int subtrahend;

        System.out.println("Minuend: ");
        minuend = scanner.nextInt();
        System.out.println("Subtrahend: ");
        subtrahend = scanner.nextInt();
        System.out.println("Ergebnis: ");
        System.out.println(minuend - subtrahend);
        calculate();
    }
    public static void multiplication() {

        Scanner scanner = new Scanner(System.in);

        int firstFactor;
        int secondFactor;

        System.out.println("1. Factor: ");
        firstFactor = scanner.nextInt();
        System.out.println("2. Factor: ");
        secondFactor = scanner.nextInt();
        System.out.println("Ergebnis: ");
        System.out.println(firstFactor * secondFactor);
        calculate();
    }
    public static void division() {

        Scanner scanner = new Scanner(System.in);

        int dividend;
        int divisor;

        System.out.println("Dividend: ");
        dividend = scanner.nextInt();
        System.out.println("Divisor: ");
        divisor = scanner.nextInt();
        System.out.println("Ergebnis: ");
        System.out.println(dividend / divisor);
        calculate();
    }
}

(Entschuldigung dass ich es nicht über ein Bild zeigen kann da nicht alles auf ein Bild passt.) Ist das schlimm? Sollte ich mir das schnell abgewöhnen?

Schonmal Danke im voraus.

Java, Programmiersprache
Javafx intersec funktioniert nicht?
class GameWindow {
    int circleX = 0;
    int circleY = 0;
    int maxX = 500;
    int maxY = 500;
    Circle circle,circlerand;
    HBox root;
    public void fenster()
    {
        figure();
        Stage stage = new Stage();
        root = new HBox();
        create();
        if(circle.getBoundsInParent().intersects(circlerand.getBoundsInParent())){
            System.out.println("circle x =" + circle.getCenterX() + " circlrand x =" + circlerand.getCenterX());
            System.out.println("GameWindow.fenster() getroffen");
            root.getChildren().remove(circlerand);
            create();
        }
        
        
        Scene scene = new Scene(root,maxX, maxY);
        scene.setOnKeyPressed((KeyEvent event) -> {
            switch (event.getCode()) {
                case UP -> {
                    if(circleY >= 2)
                    {
                        circleY -= 1;
                        circle.setTranslateY(circleY);
                        System.out.println("circle Y =" + circleY);
                        
                    }
                }
                case DOWN -> {
                    if(circleY <= (maxY - 42)){
                        circleY += 1;
                    circle.setTranslateY(circleY);
                    System.out.println("circle Y =" + circleY);
                    }
                    
                }
                case LEFT -> {
                    if(circleX >= 0){
                        circleX -= 1;
                        circle.setTranslateX(circleX);
                        System.out.println("circle x = " + circleX);
                    }
                }
                case RIGHT -> {
                    if(circleX <= maxX - 30){
                        circleX += 1;
                        circle.setTranslateX(circleX);
                        System.out.println("circle x =" + circleX);
                        
                    }
                }
                case SHIFT -> {
                System.out.println("circlerand x =" + circlerand.getCenterX() + " y=" + circlerand.getCenterY());
                    System.out.println("circle x = " + circle.getCenterX() + " y = " + circle.getCenterY());
                    
                       
                }
            }
        });
        
        
        
        root.getChildren().addAll(circle);
        stage.setScene(scene);
        stage.show();
    }
    
    private void figure(){
        circle = new Circle(circleX,circleY,15);
          
    }
    
        private void create(){
            Random rand = new Random();
            int x = rand.nextInt(450);
            int y = rand.nextInt(450);
            circlerand = new Circle(x,y,10);
            circlerand.setTranslateX(x);
            circlerand.setTranslateY(y);
            System.out.println("circlerand x =" + circlerand.getCenterX() + " y=" + circlerand.getCenterY());                    
            root.getChildren().add(circlerand);
            
            
        }
    
}

Moin, ich möchte abfragen ob 2 Kreise kollidieren jedoch funktioniert es nicht. Jemand ne Idee woran es liegt?

Java, Programmiersprache
Welche Programmiersprache nach javascript?

ich hab eine lange zeit nichts anderes als javascript gemacht darunter ist auch Typescript und react und vieles mehr und klar man kann noch mehr lernen. Php kann ich ausreichend fürs backend.

aber immer auf den Browser beschränkt zu sein und websites macht auf Dauer keinen spass. Ich will auch in der lage sein desktop programme zu schreiben.
electron js kann das aber ist auch nicht das beste was man nutzen kann und sobalds aufwendiger wird hat man Probleme und riesige Dateien. Man lernt auch nichts neues dadurch das ist nichts für mich.

c# c++ c java oder rust hatte ich im kopf.

(python syntax gefällt mir auch nicht , mir geht es auch ums lernen. Nicht nur mit pip install irgendwas nutzen von jemand anderes. Am ende hast du keine ahnung von der programmierung)

aber wie weiss ich welches der oben genannten Sprachen eher was für mich ist.

Java ist Typescript sehr ähnlich, läuft überall und ich könnte da schnell zurechtkommen aber dafür ist es deutlich langsamer als C++ und nicht so mächtig.

Mit c++ lernst du auch viel und wird oft in Unis oder Schulen gelehrt, hätte damit einen vorteil wenn ich es schon gut kann.
Rust hat einen kleinen hype und viele meinen es wird in zukunft wichtiger werden = mehr jobs.

c# ist soweit ich weiss
nur für windows Anwendungen gut, mit den anderen sprachen könnte man auch in zukunft was für linux machen wenn man lust drauf hat.

ich seh da keinen grossartigen vorteil zu java oder c++ in der schnelligkeit.

Computer, Microsoft, App, IT, Webseite, Java, JavaScript, compiler, Cplusplus, C Sharp, CPP, Informatik, Oracle, Programmiersprache, Python, sdk, C (Programmiersprache), React, Angular
Binäre suche mit Java, system falls Zahl nicht vorhanden?

Moin,

Folgendes:

Ich habe ein array mit 25.000 Feldern, in diesem sind aufsteigend quadratzahlen gespeichert. Das Programm fragt aktuell ab nach welcher Zahl man sucht und sucht dann systematisch das Array ab mittels annäherung. Ich hab nur absolut keine idee wie ich es einbauen kann, dass er merkt wenn die Zahl nicht vorhanden ist. Meine idee war, das er die Variable des letzten versuchs, mit der des aktuellen versuchs dividiert und wenn das Ergebnis = 0 ist, soll er ausgeben das die zahl nicht vorhanden ist. Leider passiert es dadurch aber manchmal das er anzeigt das die Zahl nicht vorhanden ist obwohl sie das ist, immer dann wenn er ein Feld neben der gesuchten Zahl sucht. Hier mal der relevante Teil des Codes:

int resultIndex;
int bereich = 12500;
int alg = 6250;
int bereich2 = 0;

while(true)
{


    if(quadratZahlen[bereich] < zahl)
    {
        bereich = bereich + alg;
        alg = alg / 2;

    }
    else if(quadratZahlen[bereich] == zahl)
    {
        resultIndex = bereich;
        break;
    }
    else if(quadratZahlen[bereich] > zahl)
    {
        bereich = bereich / 2;

        alg = bereich / 2;

    }


    int test = bereich - bereich2;

    if (test == 0)
    {
        resultIndex = -1;
        break;
    }

    bereich2 = bereich;

}

bereich2 ist die variable der letzten suche

bereich die der aktuellen suche

alg dient nur zur neu berechnung von bereich wenn die Zahl nicht gefunden wurde

resultIndex zeigt den Platz der gefundenen Zahl

Computer, Software, Studium, Mathematik, Technik, programmieren, Java, Array, Entwicklung, Informatik, Programmiersprache, Softwareentwicklung, Algorithmus, binär, Programmierung Java, IntelliJ IDEA

Meistgelesene Fragen zum Thema Java