繁体   English   中英

Junit-测试不同的类

[英]Junit - testing a different class

嗨,我正在努力让我了解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);
}

}

您的班级设计并不能真正用于自动化测试。

  • 该类中唯一的方法是私有静态方法,这意味着只能从该类内部的其他静态方法中访问它们(尽管如果绝对必须具有私有静态成员,则可以使用Reflection来克服这一点。)
  • 该课程的某些部分需要用户输入/干预,这使得自动测试变得困难。
  • 您的课程不是面向对象的。 它更像具有主体和全局功能的功能程序(例如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类的公共方法,可以单独进行测试。
  • 包含两个操作数和一个运算符的主要数学逻辑在另一种公共方法中,也可以对其进行测试。
  • 用户输入和输出保留在main方法中,因为它是您要使用自动测试进行测试的逻辑(不是用户输入/输出)。
  • 输入的所有类型转换都保留在main方法中。 您的方法应该对正确的数据类型进行操作,而不是将Strings作为输入,然后尝试解析它们。 将解析(以及解析的错误处理)留在main方法中。
  1. 放弃所有静态方法。
  2. 在您的Calculator的主要创建实例中,并运行calculate方法。
  3. 现在您可以使用JUnit测试Calcultor的计算方法

如果测试类在同一个程序包中(但在测试源中),则将范围限制为包将使您能够测试此类

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 ");

new Calculator().calculate(s1, s2, op);
}

public void calculate(String s1, String s2, String op)
    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);

}

 double divideValues(String s1, String s2) {
    double d1 = Double.parseDouble(s1);
    double d2 = Double.parseDouble(s2);
    double result = d1 / d2;
    return result;
}

 double multiplyValues(String s1, String s2) {
    double d1 = Double.parseDouble(s1);
    double d2 = Double.parseDouble(s2);
    double result = d1 * d2;
    return result;
}

 double subtractValues(String s1, String s2) {
    double d1 = Double.parseDouble(s1);
    double d2 = Double.parseDouble(s2);
    double result = d1 - d2;
    return result;
}

 double addValues(String s1, String s2) {
    double d1 = Double.parseDouble(s1);
    double d2 = Double.parseDouble(s2);
    double result = d1 + d2;
    return result;
}

 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测试中,您可以在测试文件中包含类。 无需复制和粘贴类中的代码并将其放入测试文件中。 它看起来更像:

计算器c =新的Calculator();

c.myFunction();

您也可以在测试函数中添加断言语句,以确认从函数调用中获得正确的结果。

我仅使用Eclipse完成了JUnit测试,但实际上您创建了一个新的JUnit文件(就像对Class一样),并且该文件自动设置了文件的基本结构。 然后,您可以从那里添加所需的许多测试。 您也可以导入所需的任何类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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