首页 > 解决方案 > 使用带有布尔输出的 Int 输入测试日期是否有效的类,以及如何测试(java)

问题描述

我有一个类的作业,我必须在其中创建一个类(称为 FunWithCalendars),它接受 3 个 int 值(月、日和年)并使用 1 个布尔方法(isValid)来检查整个日期是否有效,这使用 3 个其他辅助方法(isLeapYear、isValidMonth、isValidDay)来确定给定的日期和月份是否有效。我现在想在 Eclipse 中测试我的文件。到目前为止,我已经学会了用这段代码测试类/方法(我是新手,所以这是我知道的唯一方法):

public class driverFunWithCalendars {
    public static void main(String [] args ) {
        FunWithCalendars test = new FunWithCalendars () ;
        System.out.println( test.FunWithCalendars () );

但是,当我必须输入方法中未定义的 int 值时,我不明白我应该如何测试布尔方法的真假。上面代码中的错误在“new FunWithCalendars () ;” 和“(test.funwithcalendars());”。这是我的主要代码:

public class FunWithCalendars
{
    private int month, day, year;
    
    public FunWithCalendars( int m, int d, int y )
    {
        month = m;
        day = d;
        year = y;
    }
    
     public boolean isValid ( boolean isValidMonth, boolean isValidDay ) 
     { 
         if ( isValidMonth && isValidDay ) 
         {
             return true;
         }
         else 
         {
             return false;
         }
        
     }
                 
          
    
     public boolean isLeapYear (int year) 
     {
        
        if ( (year / 400) == 0 )  
        {
            return true;
        }
        else if ( ((year / 4) == 0) && ((year/100) !=0))
        {
            return true;
        }
        else 
        {
            return false;
        }
     }
    
     public boolean isValidMonth ( int month )  
     {
        if ( month >= 1 && month <= 12 ) 
        {
            return true;
        }
        else 
        {
            return false;
        }
     }
    
     public boolean isValidDay  ( int month, int day, int year, boolean isLeapYear ) 
     {
         if ( (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) && ((day<=31) && (day>=1)) ) 
         {
             return true;
         }
         else if ( (month == 4 || month == 6 || month == 9 || month == 11) && ((day<=30) && (day>=1)) ) 
         {
             return true;
         }
         else if ( (month == 2) && ( isLeapYear = true) && ((day<=29) && (day>=1)) ) 
         {
             return true;
         }
         else if ( (month == 2) && ( isLeapYear = false) && ((day<=28) && (day>=1)) ) 
         {
             return true;
         }
         else 
         {
             return false;
         }
     }
     
}
     

}
}

基本上,我只想知道如何使用我的 isValid 方法使用 3 个 int 值(日期、月份、年份)来测试我的代码,以查看日期是否有效。如果我的问题不清楚,或者我解释的分配方式令人困惑,我真的很抱歉,但就像我说我是 Java 和 Stackoverflow 问题的新手,我还没有理解 Java,以至于我可以更有效地提出问题和简洁的问题,但我真的希望你们中的一些人能帮助我。我还会附上我原始作业的抄本,如果您想帮助我,这可能会减少您的困惑和帮助:

/* 我们今天使用的日历是公历,由意大利天文学家 Aloysius Lilius 设计,并由教皇格里高利十三世于 1582 年 2 月 24 日颁布。在公历中,一年的平均长度正好是 365.2425 天。我们可以通过一些相当复杂的“闰年”规则来实现这一点:

如果一年能被 4 整除,那么它就是闰年……除非它可以被 100 整除,在这种情况下它不是闰年……除非它可以被 400 整除,在这种情况下它就是闰年。

好吧,这很混乱。让我们再试一次:

一年是闰年,如果:

一个。它可以被 400 整除

湾。它可以被 4 整除,但不能被 100 整除。

根据这些规则,1512、1600 和 2000 年是闰年。1514、1700 和 1900 不是。

(你认为闰年只是每四年一次!朱利叶斯·凯撒的日历就是这种情况——这是错误的,因为每四年添加一个第 366 天将使我们的平均年长度为 365.25 天,而不是更准确的 365.2425天。每年 0.0075 天听起来并不多,但在 1500 年代,天文学家注意到可预测的事件,如至日和春分,“关闭”了大约 10 天。因此有了改进的新日历。)

在公历中,每个月的天数如下:

月份名称天

31 年 1 月 1 日

2 月 2 日 28 日或 29 日

31 年 3 月 3 日

30 年 4 月 4 日

31 年 5 月 5 日

30 年 6 月 6 日

31 年 7 月 7 日

8 月 31 日

30 年 9 月 9 日

10 月 10 日 31

11 月 11 日 30

12 月 12 日 31

根据公历的闰年规则和通常的每月天数,完成 FunWithCalendars 类。你会需要:

三个 int 字段变量,用于跟踪月、日和年。

FunWithCalendars 的构造函数,它将接受月、日和年的值,并将它们分配给字段变量。(这是为您编写的,您可以使用启动文件 FunWithCalendars.java )。

方法:

布尔 isValid()

这将返回一个真或假。真实结果意味着月份和日期是该年的有效值。

您将需要三个辅助方法:

boolean isLeapYear()

仅当年份代表闰年时才会返回 true。

您还需要:

布尔 isValidMonth()

仅当月份字段介于 1 和 12 之间时才会返回 true。最后:

布尔 isValidDay()

只有当那一天存在于给定年份的那个月时,它才会返回 true。请记住在检查 29 是否在 2 月有效时检查闰年!

同样,当且仅当我们从 isValidMonth() 和 isValidDay() 中获得 true 时,我们才期望 isValid() 为 true。(我们假设所有年份都有效。)

测试:

2010 年 7 月 20 日有效。

2009 年 13 月 1 日无效。(13 月不是有效月份。)

2009 年 11 月 31 日无效。(那一天在那个月里不存在。)

2/29/2007 无效。(2007 年不是闰年。)

2/29/2000 有效。(2000 年是闰年。)

*/

感谢任何能提供帮助的人!

标签: javatestingcalendar

解决方案


我们以第一个测试为例:

测试:

2010 年 7 月 20 日有效。

因此,在您的驱动程序类/测试类中构造一个FunWithCalendars表示 2010 年 7 月 20 日的对象。构造函数为此目的采用三个参数。接下来调用它的isValid方法。我相信这个想法是你不应该再次传递相同的论点。你的isValid方法有两个boolean参数。相反,我认为它不应该接受任何参数,并且它本身调用两个辅助方法,传递FunWithCalendars对象内部已经存在的值。因此,在您可以让您的驱动程序类工作之前,我相信您必须在这一点上修复您的设计。

一旦调用到isValid()工作,将返回值存储到变量中。将其与预期值进行比较(true在这种情况下)。如果它们相等,则打印测试通过的语句。如果它们不相等,则打印一个包含预期值和观察值的语句。

对其他测试进行类似的操作。不过,不要复制粘贴代码。而是将其包装在一个方法中并为每个测试用例调用该方法,并将该特定测试所需的数据作为参数传递。请记住将预期结果作为参数包含在内,以便方法可以进行比较。

编辑:

…我的困惑在于如何构造一个对象(通常,特别是 FunWithCalendars),如何调用 isValid 方法并让它不带任何参数,如何让 isValid 方法调用两个传递值的辅助方法位于 FunWIthCalendars 对象中。

这是基础知识,我认为 Stack Overflow 不是教授基础知识的好地方。让我们试一试,只是请将您的期望放低。

如何构造一个对象:您已经在您的驱动程序类中使用new运算符执行此操作:

    FunWithCalendars test = new FunWithCalendars () ;

只有您需要将正确的参数传递给构造函数。你的构造函数需要三个int参数,所以它需要是这样的:

    FunWithCalendars test = new FunWithCalendars(7, 20, 2020);

isValid在上述行之后,如何调用该方法并使其不带参数:

    boolean calculatedValidity = test.isValid();

这将从isValid()(false或) 返回的值存储到我命名true的新创建的变量中。从那里我们可以检查它是否具有预期值,根据它采取行动和/或打印它。最简单的就是打印出来,例如:booleancalculatedValidity

    System.out.println("Is 7/20/2020 valid? " + calculatedValidity);

不带参数调用要求该方法没有任何参数:

public boolean isValid () 
{ 

如何isValid()调用这两个辅助方法:您可以简单地编写方法调用来代替提及之前存在的参数。再次记住传递正确的参数:

    if (isValidMonth(month) && isValidDay(month, day, year, isLeapYear(year)) ) 

在此处的方法调用中,我使用FunWithCalendars对象的实例变量(字段)作为参数。这导致该方法使用我们通过构造函数输入的数字并使用三个辅助方法。

我已经使用上述更改运行了您的代码。我的打印语句打印了预期的:

Is 7/20/2020 valid? true

PS 我故意不说你代码中可能存在的错误。让你的测试告诉你是否有任何东西对你来说要好得多。


推荐阅读