您好,我正在努力了解 Junit 测试,但如果不复制粘贴其中的部分内容,我找不到测试另一个类的方法。说我想测试这个:
import java.io.*;
public class Calculator {
public static void main(String[] args) {
String s1 = getInput("Enter a numeric value: ");
String s2 = getInput("Enter a numeric value: ");
String op = getInput("Enter 1=ADD, 2=Subtract, 3=Multiply, 4=Divide ");
int opInt = Integer.parseInt(op);
double result = 0;
switch (opInt) {
case 1:
result = addValues(s1, s2);
break;
case 2:
result = subtractValues(s1, s2);
break;
case 3:
result = multiplyValues(s1, s2);
break;
case 4:
result = divideValues(s1, s2);
break;
default:
System.out.println("You entered an incorrect value");
return;
}
System.out.println("The answer is " + result);
}
private static double divideValues(String s1, String s2) {
double d1 = Double.parseDouble(s1);
double d2 = Double.parseDouble(s2);
double result = d1 / d2;
return result;
}
private static double multiplyValues(String s1, String s2) {
double d1 = Double.parseDouble(s1);
double d2 = Double.parseDouble(s2);
double result = d1 * d2;
return result;
}
private static double subtractValues(String s1, String s2) {
double d1 = Double.parseDouble(s1);
double d2 = Double.parseDouble(s2);
double result = d1 - d2;
return result;
}
private static double addValues(String s1, String s2) {
double d1 = Double.parseDouble(s1);
double d2 = Double.parseDouble(s2);
double result = d1 + d2;
return result;
}
private static String getInput(String prompt) {
BufferedReader stdin = new BufferedReader(
new InputStreamReader(System.in));
System.out.print(prompt);
System.out.flush();
try {
return stdin.readLine();
} catch (Exception e) {
return "error: " + e.getMessage();
}
}
有什么方法可以设置 JUnit 案例测试来检查其中的某些部分,而无需为每个测试复制和粘贴它或修改原始类。我是不是遗漏了什么或者这是 Junit 做不到的?
这是我目前的情况:
import static org.junit.Assert.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.junit.Test;
public class CalculatorTest {
Calculator mycalculator = new Calculator();
@Test
public void test1( ) {
mycalculator;
assertEquals(d1 + d2, 20);
}
}
最佳答案
您的类(class)设计并不真正适合自动化测试。
- 该类中唯一的方法是私有(private)静态方法,这意味着它们只能从该类中的其他静态方法访问(尽管如果您绝对必须拥有私有(private)静态成员,可以使用反射来克服这一点。)<
- 部分类(class)需要用户输入/干预,这使得自动测试它们变得困难。
- 您的类(class)不是面向对象的。它更像是一个函数式程序(例如 C),具有主体和全局函数,而不是编写为提供功能的对象。
尝试这样的事情:
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Calculator {
// TODO: Move enum to another file
public static enum OperatorType {
ADD,
SUBTRACT,
MULTIPLY,
DIVIDE
}
public double calculateResult(double operand1, double operand2, OperatorType operator) {
double result = 0;;
switch (operator) {
case ADD:
result = addValues(operand1, operand2);
break;
case DIVIDE:
result = subtractValues(operand1, operand2);
break;
case MULTIPLY:
result = multiplyValues(operand1, operand2);
break;
case SUBTRACT:
result = subtractValues(operand1, operand2);
break;
default:
break;
}
return result;
}
public double divideValues(double d1, double d2) {
double result;
if (d2 != 0) {
result = d1 / d2;
} else {
// Avoid divide-by-zero error (could also throw it if preferred)
result = 0;
}
return result;
}
public double multiplyValues(double d1, double d2) {
double result = d1 * d2;
return result;
}
public double subtractValues(double d1, double d2) {
double result = d1 - d2;
return result;
}
public double addValues(double d1, double d2) {
double result = d1 + d2;
return result;
}
public static void main(String[] args) {
// Get and validate user input
String s1 = getInput("Enter a numeric value: ");
String s2 = getInput("Enter a numeric value: ");
String op = getInput("Enter 1=ADD, 2=Subtract, 3=Multiply, 4=Divide ");
// TODO: Handle NumberFormatExceptions here
double operand1 = Double.parseDouble(s1);
double operand2 = Double.parseDouble(s2);
OperatorType operator;
int opInt = Integer.parseInt(op);
switch (opInt) {
case 1:
operator = OperatorType.ADD;
break;
case 2:
operator = OperatorType.SUBTRACT;
break;
case 3:
operator = OperatorType.MULTIPLY;
break;
case 4:
operator = OperatorType.DIVIDE;
break;
default:
System.out.println("You entered an incorrect value");
return;
}
// Use class to calculate result
Calculator calculator = new Calculator();
double result = calculator.calculateResult(operand1, operand2, operator);
// Output results
System.out.println("The answer is " + result);
}
private static String getInput(String prompt) {
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
System.out.print(prompt);
System.out.flush();
try {
return stdin.readLine();
} catch (Exception e) {
return "error: " + e.getMessage();
}
}
}
- 您所有的个人数学运算都是 Calculator 类的公共(public)方法,可以单独测试。
- 采用两个操作数和一个运算符的主要数学逻辑在另一个公共(public)方法中,也可以对其进行测试。
- 用户输入和输出保留在 main 方法中,因为它是您要通过自动化测试测试的逻辑(而不是用户输入/输出)。
- 输入的所有类型转换都保留在 main 方法中。您的方法应该对正确的数据类型进行操作,而不是将字符串作为输入然后尝试解析它们。将解析(以及解析的错误处理)留在 main 方法中。
关于java - Junit - 测试不同的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31008040/