gpt4 book ai didi

java - Junit - 测试不同的类

转载 作者:行者123 更新时间:2023-11-28 21:10:30 25 4
gpt4 key购买 nike

您好,我正在努力了解 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com