如何找出JUnit测试用例失败的原因?

时间:2013-09-16 22:28:25

标签: java testing junit

我必须修改我的类,以便它传递JUnit测试用例。似乎一切都应该工作正常但它仍然失败。它给了我一个java.lang.AssertionError。

这是我的班级

package dayofweek;
/**
 * Method to find out what day of the week a certain date was
 * 
 * Output determines what day of the week this certain date was
 *
 */
public class DayOfWeek {
    private int myMonth = -1, myDayOfMonth = -1, myYear= -1, myAdjustment= -1, numericDayOfWeek= -1, remainderSeven= -1;
    private static final int NO_VALUE = -1;
    /**
     * @param what the date was
     */
    public DayOfWeek(int month, int dayOfMonth, int  year){
        myMonth = month;
        myDayOfMonth = dayOfMonth;
        myYear = year;
        remainderSeven = 0;
        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; 
        remainderSeven = numericDayOfWeek % 7;
    }
     /**
      * @return the month in a string
      */
     public String getMonthString(){
         String[] arrayOfMonths = new String[12];
         arrayOfMonths[0] = "January";
         arrayOfMonths[1] = "February";
         arrayOfMonths[2] = "March";
         arrayOfMonths[3] = "April";
         arrayOfMonths[4] = "May";
         arrayOfMonths[5] = "June";
         arrayOfMonths[6] = "July";
         arrayOfMonths[7] = "August";
         arrayOfMonths[8] = "September";
         arrayOfMonths[9] = "October";
         arrayOfMonths[10] = "November";
         arrayOfMonths[11] = "December";
         if (this.myMonth > 0 && this.myMonth <=12){
             return arrayOfMonths[this.myMonth-1];
         }
         else{
             return null;
         }
     }
     /**
      * @return what day of the month it was
      */
     public int getDayOfMonth(){
         if(myDayOfMonth != NO_VALUE){
         return myDayOfMonth;
     }
         else{
             return NO_VALUE;
         }
     }
     /**
      * @return what year it was
      */
     public int getYear(){
         if(myYear != NO_VALUE){
             return myYear;
         }
         else{
             return NO_VALUE;
         }
     }
     /**
         * @return the numeric day of the week
         */
    public int getNumericDayOfWeek(){

        return remainderSeven;

    }

    /**
     * returns what day of the week it was
     */
    public String getDayOfWeek(){   
        String[] arrayOfDays = new String[7];
        arrayOfDays[0] = "Saturday";
        arrayOfDays[1] = "Sunday";
        arrayOfDays[2] = "Monday";
        arrayOfDays[3] = "Tuesday";
        arrayOfDays[4] = "Wednesday";
        arrayOfDays[5] = "Thursday";
        arrayOfDays[6] = "Friday";
        if( myMonth != NO_VALUE && myDayOfMonth != NO_VALUE && myYear != NO_VALUE){
            return arrayOfDays[remainderSeven];
        }

         else{
             return null;
         }
     }




     /**
      * @return the month in an int
      */
     public int getMonth(){
        if(myMonth != NO_VALUE){
            return myMonth;
        }
        else return NO_VALUE;
     }




}

这是JUnit测试类

package dayofweektesting;

import dayofweek.DayOfWeek;
import static org.junit.Assert.*;
import org.junit.Test;

/**
 * Test cases for "Day of week" lab assuming requirements set 
 * at top of DayOfWeek class
 * 
 * Test valid leap years
 * 
 *
 */
public class TestValidLeapYears {

    /**
     * Test valid 2/29/XXXX dates
     */
    @Test
    public void firstValidLeapYear() {
        DayOfWeek dow = new DayOfWeek(2, 29, 1904);
        assertTrue(dow.getDayOfWeek().compareTo("Monday") == 0);
        assertTrue(dow.getNumericDayOfWeek() == 2);
    }

    @Test
    public void secondValidLeapYear() {
        DayOfWeek dow = new DayOfWeek(2, 29, 1908);
        assertTrue(dow.getDayOfWeek().compareTo("Saturday") == 0);
        assertTrue(dow.getNumericDayOfWeek() == 0);
    }

    @Test
    public void thirdValidLeapYear() {
        DayOfWeek dow = new DayOfWeek(2, 29, 1912);
        assertTrue(dow.getDayOfWeek().compareTo("Thursday") == 0);
        assertTrue(dow.getNumericDayOfWeek() == 5);
    }

    @Test
    public void fourthValidLeapYear() {
        DayOfWeek dow = new DayOfWeek(2, 29, 1916);
        assertTrue(dow.getDayOfWeek().compareTo("Tuesday") == 0);
        assertTrue(dow.getNumericDayOfWeek() == 3);
    }

    /**
     * Test boundary dates of2/28/XXXX and 3/1/XXXX for valid leap years
     */
    @Test
    public void firstValidLeapYearBoundaries() {
        DayOfWeek dow = new DayOfWeek(2, 28, 1904);
        assertTrue(dow.getDayOfWeek().compareTo("Sunday") == 0);
        assertTrue(dow.getNumericDayOfWeek() == 1);
        dow = new DayOfWeek(3, 1, 1904);
        assertTrue(dow.getDayOfWeek().compareTo("Tuesday") == 0);
        assertTrue(dow.getNumericDayOfWeek() == 3);
    }

    @Test
    public void secondValidLeapYearBoundaries() {
        DayOfWeek dow = new DayOfWeek(2, 28, 1908);
        assertTrue(dow.getDayOfWeek().compareTo("Friday") == 0);
        assertTrue(dow.getNumericDayOfWeek() == 6);
        dow = new DayOfWeek(3, 1, 1908);
        assertTrue(dow.getDayOfWeek().compareTo("Sunday") == 0);
        assertTrue(dow.getNumericDayOfWeek() == 1);
    }

}

这是错误指向的行,在secondValidLeapYearBoundaries()

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

有谁知道如何解决所有这些问题?

1 个答案:

答案 0 :(得分:2)

如何解决?打印失败案例的dow.getDayOfWeek()的返回值(或在调试器中检查它),看看 给你的是什么,然后单步执行函数找出为什么。在这种特殊情况下,它可能是构造函数而不是getDayOfWeek,因为后者只是给你前者计算的信息。

这就是你如何解决几乎任何问题,在编码和大多数其他确定性领域。确认存在问题,然后重新检查步骤以查看问题的引入位置。