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.