Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用junit测试带有开关盒的程序_Java_Junit - Fatal编程技术网

Java 使用junit测试带有开关盒的程序

Java 使用junit测试带有开关盒的程序,java,junit,Java,Junit,我想用junit为计算器程序编写测试用例。我不熟悉junit环境。我可以为其他程序编写测试,但有点拘泥于switch()用例的测试 我真的很想知道怎么做 提前谢谢 这是我的节目 import java.util.Scanner; //This program performs basic math operations such as :- +,-,*,/ public class Calculator { public static void main(Stri

我想用junit为计算器程序编写测试用例。我不熟悉junit环境。我可以为其他程序编写测试,但有点拘泥于switch()用例的测试

我真的很想知道怎么做

提前谢谢

这是我的节目

 import java.util.Scanner;

 //This program performs basic math operations such as :- +,-,*,/
  public class Calculator 

  {      
 public static void main(String[] args) 

 {
     double number1, number2;
     String Mathoperation;
     Scanner scannerObject = new Scanner(System.in);

     System.out.println("Enter first number");
     number1 = scannerObject. nextDouble();

     System.out.println("Enter second number");
     number2 = scannerObject. nextDouble();

     Scanner UserInput = new Scanner(System.in);
     System.out.println("\nHere are your options:");
     System.out.println("\n1. Addition, 2. Subtraction, 3. Divison, 4. Multiplication");
     Mathoperation = UserInput.next();

     switch (Mathoperation)  
     {
       case "1":
       System.out.println("Your answer is " + (number1 + number2));
       break;

       case "2":
       System.out.println("Your answer is " + (number1 - number2));
       break;

       case "3":
       System.out.println("Your answer is " + (number1 / number2));
       break;

       case "4":
       System.out.println("Your asnwer is " + (number1 * number2));
       break;

       default:
       System.out.println("");      
     }   
 }  

}

要编写单元测试,您通常必须有要测试的API片段。在您的例子中,所有内容都在收集用户输入的主方法中,因此很难进行测试。您应该提取类似于返回答案的
双重执行操作(number,number,operation)
方法的内容。然后,您可以使用此方法的不同输入编写JUnit测试。

编写单元测试的第一步是编写可测试代码。在这一点上,你的代码不是很容易测试,也就是说你可以测试它,但它不是最好的测试。让我们看看原因

第一个原因是您的所有代码都在主函数中。您通常希望避免这种情况。这有多种原因,但我认为最大的两个原因是可读性和可重用性。通常你会想把东西放到不同的类中,但为了时间起见,我们只需要把你的数学开关放到它自己的函数中

import java.util.Scanner;

     //This program performs basic math operations such as :- +,-,*,/
public class Calculator 

{      
 public static void main(String[] args) 

 {
   double number1, number2;
   String Mathoperation;
   Scanner scannerObject = new Scanner(System.in);

   System.out.println("Enter first number");
   number1 = scannerObject. nextDouble();

   System.out.println("Enter second number");
   number2 = scannerObject. nextDouble();

   Scanner UserInput = new Scanner(System.in);
   System.out.println("\nHere are your options:");
   System.out.println("\n1. Addition, 2. Subtraction, 3. Divison, 4. Multiplication");
   Mathoperation = UserInput.next();
   doMath(Mathoperation, number1, number2)
 }

 public double doMath(String Mathoperation, double number1, double number2){
   switch (Mathoperation)  
   {
     case "1":
     System.out.println("Your answer is " + (number1 + number2));
     break;

     case "2":
     System.out.println("Your answer is " + (number1 - number2));
     break;

     case "3":
     System.out.println("Your answer is " + (number1 / number2));
     break;

     case "4":
     System.out.println("Your asnwer is " + (number1 * number2));
     break;

     default:
     System.out.println("");      
   }   
 }
}
好的,很酷,现在我们有了自己的数学运算方法。一个问题是tho。这本身不是一个单位,这实际上是加法和我们的数学运算之间的集成。这意味着,为了测试,我们需要测试算术的每个组合(加、减、除、乘)以及方法是否选择了正确的运算符。这比我们想要的要多得多,而且不是一个很好的测试,那么我们如何解决这个问题呢?很简单,我们进一步细分

import java.util.Scanner;

     //This program performs basic math operations such as :- +,-,*,/
public class Calculator {
//Code for use input somewhere here      
 public double doMath(String Mathoperation, double number1, double number2){
   switch (Mathoperation)  
   {
     case "1":
     System.out.println("Your answer is " + add(number1, number2));
     break;

     case "2":
     System.out.println("Your answer is " + sub(number1, number2));
     break;

     case "3":
     System.out.println("Your answer is " + div(number1, number2));
     break;

     case "4":
     System.out.println("Your answer is " + mul(number1, number2));
     break;

     default:
     System.out.println("");      
   }   
 }
 public double add(double number1, double number2){
   return number1 + number2;
 }
 public double sub(double number1, double number2){
   return number1 - number2;
 }
 public double mul(double number1, double number2){
   return number1 * number2;
 }
 public double div(double number1, double number2){
   return number1 / number2;
 }
}

现在我们的单位更容易分解。从这里,您可以为
add
sub
div
mul
函数编写测试。对其进行测试,以确保其功能符合预期。然后为
doMath
函数编写测试,确保它将值传递给正确的操作。通过这种方式,当某件事情失败时,你确切地知道它的失败之处以及问题所在,而不是猜测。您将知道是
doMath
有问题,还是您的其他数学方法有问题。它还允许您更容易地将方法用于其他事情,因此win-win考虑将输入、计算和输出放入(非静态)方法中,这将使逻辑测试成为可能:

//This program performs basic math operations such as :- +,-,*,/
public class Calculator {

    double number1, number2;
    String Mathoperation;

    Calculator()

    {

        //you need to remove input and calculation logic from constructor,
        //to avoid running it when constructing this object for testing.
    }

    public void run() {

        getInput();
        double result = doMath(Mathoperation, number1, number2 );

        System.out.println("Your answer is " + result );
    }

    private void getInput() {

        Scanner scannerObject = new Scanner(System.in);

        System.out.println("Enter first number");
        number1 = scannerObject. nextDouble();

        System.out.println("Enter second number");
        number2 = scannerObject. nextDouble();

        Scanner UserInput = new Scanner(System.in);
        System.out.println("\nHere are your options:");
        System.out.println("\n1. Addition, 2. Subtraction, 3. Divison, 4. Multiplication");
        Mathoperation = UserInput.next();
    }

    /**
     *@param mathoperation
     */
    public double  doMath(String mathoperation, double number1, double number2) {

        switch (mathoperation)
        {
        case "1":
            return (number1 + number2);

        case "2":
            return  (number1 - number2);

        case "3":
            return (number1 / number2);

        case "4":
            return (number1 * number2);

        default:
            throw new IllegalStateException("mathoperation is not valid");
        }
    }

    public static void main(String[] args)

    {
        Calculator calc = new  Calculator();
        calc.run();
    }
}
下面是一个非常简单的JUnit测试示例:

public class CalculatorTest {

    /**
     * Test method for {@link Calculator#doMath(java.lang.String, double, double)}.
     */
    @Test
    public void testDoMath() {

        Calculator calc = new Calculator();

        assertTrue(calc.doMath("1", 5, 7) == 12.0);
        assertTrue(calc.doMath("2", 5, 7) == -2.0);
        assertTrue(calc.doMath("3", 5, 7) == (5.0/7.0));
        assertTrue(calc.doMath("4", 5, 7) == (5.0*7.0));
    }

}

谢谢@moh。我修好了。对于我来说,这总是一个进退两难的问题,我是否应该仅仅为了可测试性而暴露更多的信息。我通常将测试所需的内容公开,并在测试后将其更改为私人或其他任何内容。@s.p我很高兴它有所帮助。如果需要更多的澄清,请随时询问。考虑投票。