简体   繁体   中英

How to write Junit test for this java code?

So my problem is that i need to write a junit test for this code and I'm not able to. What the code does is, depending on the input it will give a grade.

import java.util.Scanner;

public class Grade{

    static void getNumericGrade(){
        Scanner input = new Scanner(System.in);
        System.out.print("Enter numeric grade: ");
        double numGrade = input.nextDouble();
        String letterGrade;
        /**
         *  Method creation to convert numeric grade or GPA to letter grade
         * @param numGrade is GPA
         */

        if (numGrade > 4.00 || numGrade < 0) {
            letterGrade = "N";
        }
        else if (numGrade >= 3.85 && numGrade <= 4.0 )
        {
            letterGrade = "A+";
        }
        else if (numGrade >= 3.5 && numGrade < 3.85 )
        {
            letterGrade = "A";
        }
        else if (numGrade  >= 3.333 && numGrade < 3.5 )
        {
            letterGrade = "A-";
        }
        else if (numGrade >= 3.0 && numGrade < 3.333 )
        {
            letterGrade = "B+";
        }
        else if (numGrade >= 2.667 && numGrade < 3.0 )
        {
            letterGrade = "B";
        }
        else if (numGrade >= 2.333 && numGrade < 2.667 )
        {
            letterGrade = "B-";
        }
        else if (numGrade >= 2.0 && numGrade < 2.333 )
        {
            letterGrade = "C+";
        }
        else if (numGrade >= 1.667 && numGrade < 2.0 )
        {
            letterGrade = "C";
        }
        else if (numGrade >= 1.333 && numGrade < 1.667 )
        {
            letterGrade = "C-";
        }
        else if (numGrade >= 1.0 && numGrade < 1.333 )
        {
            letterGrade = "D+";
        }
        else if (numGrade  > 0 && numGrade < 1.0 )
        {
            letterGrade = "D";
        }
        else        {
            letterGrade = "F";
        }

        if (letterGrade.equalsIgnoreCase("N")){
            System.out.println(numGrade + " is not a valid grade" + letterGrade);
        }
        else{
            System.out.println("Your grade is "  +  letterGrade);
        }
    }

    public static void main(String[] args) {

        /**
         * Prints letter grade from GPA
         * @return letterGrade
         */
        getNumericGrade();
    }
} 

Change the function getNumericGrade() to take a parameter instead of reading the input from the scanner, as well as to return the output instead of printing it on console:

static String getNumericGrade(double numGrade) {
    double numGrade = input.nextDouble();
    String letterGrade;
    /**
     *  Method creation to convert numeric grade or GPA to letter grade
     * @param numGrade is GPA
     */

    if (numGrade > 4.00 || numGrade < 0) {
        letterGrade = "N";
    }
    ...
    return letterGrade;
}

Change your main so that it's in there that you get the input from the scanner and print it on the screen:

Scanner input = new Scanner(System.in);
System.out.print("Enter numeric grade: ");
double numGrade = input.nextDouble();
String letterName = getNumericGrade(numGrade);
if (letterGrade.equalsIgnoreCase("N")){

    System.out.println(numGrade + " is not a valid grade" + letterGrade);
}
else{
    System.out.println("Your grade is "  +  letterGrade);
}

... and then test the method containing the logic easily like this:

@Test
public void exampleTest() {
    double testInput = 4.5;
    String grade = Grade.getNumericGrade(testInput); 
    assertEquals("expected grade", grade);
}

//more test with more inputs

Note: since the function really takes a double and returns a String all the time, you can probably write a single unit test and parametrize it.

You can check parameterized tests (available from Junit5)

Check this excellent article here about testing Println() or even better the accepted answer here: JUnit test for System.out.println()

I would go another way though. I would rewrite the function

    static string getNumericGrade(){
        Scanner input = new Scanner(System.in);
        System.out.print("Enter numeric grade: ");
        double numGrade = input.nextDouble();
        String letterGrade;
        /**
         *  Method creation to convert numeric grade or GPA to letter grade
         * @param numGrade is GPA
         */

        if (numGrade > 4.00 || numGrade < 0) {
            letterGrade = "N";
        }
        else if (numGrade >= 3.85 && numGrade <= 4.0 )
        {
            letterGrade = "A+";
        }
        else if (numGrade >= 3.5 && numGrade < 3.85 )
        {
            letterGrade = "A";
        }
        else if (numGrade  >= 3.333 && numGrade < 3.5 )
        {
            letterGrade = "A-";
        }
        else if (numGrade >= 3.0 && numGrade < 3.333 )
        {
            letterGrade = "B+";
        }
        else if (numGrade >= 2.667 && numGrade < 3.0 )
        {
            letterGrade = "B";
        }
        else if (numGrade >= 2.333 && numGrade < 2.667 )
        {
            letterGrade = "B-";
        }
        else if (numGrade >= 2.0 && numGrade < 2.333 )
        {
            letterGrade = "C+";
        }
        else if (numGrade >= 1.667 && numGrade < 2.0 )
        {
            letterGrade = "C";
        }
        else if (numGrade >= 1.333 && numGrade < 1.667 )
        {
            letterGrade = "C-";
        }
        else if (numGrade >= 1.0 && numGrade < 1.333 )
        {
            letterGrade = "D+";
        }
        else if (numGrade  > 0 && numGrade < 1.0 )
        {
            letterGrade = "D";
        }
        else        {
            letterGrade = "F";
        }

        if (letterGrade.equalsIgnoreCase("N")){

            return numGrade + " is not a valid grade" + letterGrade;
        }
        else{
            return "Your grade is "  +  letterGrade;

        }
    }

And then assert the text. You could even return the grade or -1 for non-grade and handle accordingly.

Also note that you should seldom declare functions as static in an OOP world, but that is a topic for another thread.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM