【问题标题】:How to tell what went wrong with the JUnit test? [closed]如何判断 JUnit 测试出了什么问题? [关闭]
【发布时间】:2013-09-13 23:25:57
【问题描述】:

我必须根据 JUnit 测试修复我的代码,但我不确定如何判断出了什么问题?

比如这个测试代码的函数我运行的时候出错了

@Test
    public void lastValidDay() {
        DayOfWeek dow = new DayOfWeek(12, 31, 2099);
        assertTrue(dow.getDayOfWeek().compareTo("Thursday") == 0);
        assertTrue(dow.getNumericDayOfWeek() == 5);
    }

不知道如何更改它以使其顺利运行?这是我的课程,正在测试这些不同的 JUnit。这是我必须更改的课程,以便所有测试都能顺利运行。

public class DayOfWeek1 {
    int myMonth, myDayOfMonth, myYear, myAdjustment, numericDayOfWeek;
    /*
     * @param what the date was
     */
    public DayOfWeek1(int month, int dayOfMonth, int  year){
        myMonth = month;
        myDayOfMonth = dayOfMonth;
        myYear = year;
    }
    /*
     * @return the numeric day of the week
     */
    public int getNumericDayOfWeek(){
        if(myMonth==1){
            myAdjustment = 1;
            if(myYear%4==0){
                myAdjustment=0;
            }
        }
        if(myMonth==2){
            myAdjustment = 4;
            if(myYear%4==0){
                myAdjustment=3;
            }
        }
        if(myMonth==3){
            myAdjustment = 4;
        }
        if(myMonth==4){
            myAdjustment = 0;
        }
        if(myMonth==5){
            myAdjustment = 2;
        }
        if(myMonth==6){
            myAdjustment = 5;
        }
        if(myMonth==7){
            myAdjustment = 0;
        }
        if(myMonth==8){
            myAdjustment = 3;
        }
        if(myMonth==9){
            myAdjustment = 6;
        }
        if(myMonth==10){
            myAdjustment = 1;
        }
        if(myMonth==11){
            myAdjustment = 4;
        }
        if(myMonth==12){
            myAdjustment = 6;
        }
        int fourDivides = myYear / 4;
        numericDayOfWeek = myAdjustment + myDayOfMonth + (myYear-1900) + fourDivides; 
        return numericDayOfWeek;

    }
    /*
     * returns what day of the week it was
     */
     public String getDayOfWeek(){
         if(numericDayOfWeek==0){
             return "Saturday";
         }
         if(numericDayOfWeek==1){
             return "Sunday";
         }
         if(numericDayOfWeek==2){
             return "Monday";
         }
        if(numericDayOfWeek==3){
             return "Tuesday";
         }
        if(numericDayOfWeek==4){
            return "Wednesday";
         }
        if(numericDayOfWeek==5){
            return "Thursday";
         }
         if(numericDayOfWeek==6){
             return "Friday";
         }
         else{
             return "NO_VALUE";
         }
     }
     /*
      * @return the month in an int
      */
     public int getMonth(){
         return myMonth;
     }
     /*
      * @return the month in a string
      */
     public String getMonthString(){
         if(myMonth==1){
             return "January";
         }
         if(myMonth==2){
             return "February";
         }
         if(myMonth==3){
             return "March";
         }
         if(myMonth==4){
             return "April";
         }
         if(myMonth==5){
             return "May";
         }
         if(myMonth==6){
             return "June";
         }
         if(myMonth==7){
             return "July";
         }
         if(myMonth==8){
             return "August";
         }
         if(myMonth==9){
             return "September";
         }
         if(myMonth==10){
             return "October";
         }
         if(myMonth==11){
             return "November";
         }
         if(myMonth==12){
             return "December";
         }
         else{
             return "NO_VALUE";
         }
     }
     /*
      * @return what day of the month it was
      */
     public int getDayOfMonth(){
         return myDayOfMonth;
     }
     /*
      * @return what year it was
      */
     public int getYear(){
         return myYear;
     }

}

关于找出我的代码中究竟是什么导致错误消失的任何提示?

【问题讨论】:

  • 断言应该告诉您预期值与实际值不匹配。它还会告诉你每一个是什么。只需回溯(可能使用调试器)并找出实际值的来源。

标签: java testing junit case


【解决方案1】:

问题是你在getNumbericDayOfWeek() 之前调用getDayOfWeek()。在您的构造函数中,您不会初始化 numericDayOfWeek,因此它会获得默认值 0(所有未初始化的原始类型都可以)。

public DayOfWeek1(int month, int dayOfMonth, int  year){
    myMonth = month;
    myDayOfMonth = dayOfMonth;
    myYear = year;
}

然后你打电话

assertTrue(dow.getDayOfWeek().compareTo("Thursday") == 0);

将返回

 public String getDayOfWeek(){
     if(numericDayOfWeek==0){
         return "Saturday";
     }

"Saturday" 的值,当 compareTo("Thursday") 不返回 0 时,您的测试将失败。

您需要先调用getNumericDayOfWeek()numericDayOfWeek 字段设置为其真正的语义值。


关于实际问题

关于弄清楚我的代码中究竟是什么的任何提示 错误消失了吗?

断言语句会告诉您条件为假。从那里开始,您的第一直觉应该是精简 dow.getDayOfWeek() 返回的内容,因为它不等于 "Thursday"。解决这个问题的一种方法是这样做

assertEquals("Thursday", dow.getDayOfWeek());

它会立即告诉您期望值和实际值不同以及它们的值是什么。您会看到dow.getDayOfWeek() 返回了"Saturday",然后您可以看到numericDayOfWeek 的值为0,依此类推。

【讨论】:

  • 我不能改变测试类,只能改变我自己的
  • @WergAsdfwer 然后在构造函数的末尾调用getNumbericDayOfWeek(),以便始终设置它。
  • 我把我的构造函数改成了这个,但我仍然遇到同样的错误; public DayOfWeek1(int month, int dayOfMonth, int year){ myMonth = month; myDayOfMonth = dayOfMonth;我的年 = 年; getNumericDayOfWeek(); }
  • @WergAsdfwer 那是因为您的getNumericDayOfWeek 计算不正确。这就是单元测试的重点。找出它发生以及为什么。编写您自己的单元测试。
  • @WergAsdfwer 您不能为您的作业编写自己的单元测试,但您仍然可以自己编写它们。至于你的方法,你自己试试算算吗?你的月份是 12,所以调整是 6,2099/4 是 524(整数除法)。 6 + 31 + (2099-1900) + 524 = 760
猜你喜欢
  • 1970-01-01
  • 2011-04-27
  • 2015-03-15
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多