【问题标题】:Class to test if date is valid using Int input with boolean output, and how to test (java)使用带有布尔输出的 Int 输入测试日期是否有效的类,以及如何测试(java)
【发布时间】:2020-10-19 07:41:38
【问题描述】:

我有一个类的作业,我必须在其中创建一个类(称为 FunWithCalendars),它接受 3 个 int 值(月、日和年)并使用 1 个布尔方法 (isValid) 来检查总体日期是否为valid,它使用 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 整除

b.能被 4 整除,不能被 100 整除。

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

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

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

月份名称天数

1 月 31 日 1 日

2 月 2 日 28 日或 29 日

31 年 3 月 3 日

30 年 4 月 4 日

31 年 5 月 5 日

30 年 6 月 6 日

7 月 7 日 31 日

8 月 31 日

9 月 9 日 30 日

10 月 10 日 31 日

11 月 11 日 30 日

12 月 12 日 31 日

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

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

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

方法:

boolean isValid()

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

您将需要三个辅助方法:

boolean isLeapYear()

只有当年份代表闰年时才会返回真值。

你还需要:

boolean isValidMonth()

只有当月份字段在 1 到 12 之间时才会返回 true。最后:

boolean isValidDay()

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

再次,当且仅当我们从 isValidMonth() 和 isValidDay() 中得到一个 true 时,我们期望 isValid() 为 true。 (我们将假设所有年份都有效。)

测试:

7/20/2010 有效。

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

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

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

2000 年 2 月 29 日有效。 (2000 年是闰年。)

*/

感谢任何可以提供帮助的人!

【问题讨论】:

  • 这是一个很好的任务。它足够复杂,可以帮助您学习材料。
  • 我同意,就像一个还在学习语法、方法和对象是什么、如何构造类和方法的初学者一样,这非常令人困惑。

标签: java testing calendar


【解决方案1】:

我们以第一个测试为例:

测试:

7/20/2010 有效。

因此,在您的驱动程序类/测试类中构造一个 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()falsetrue)返回的值存储到我命名为calculatedValidity 的新创建的boolean 变量中。从那里我们可以检查它是否具有预期值,根据它采取行动和/或打印它。最简单的就是打印出来,例如:

    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 我故意不说你代码中可能存在的错误。让你的测试告诉你是否有任何东西对你来说要好得多。

【讨论】:

  • 非常感谢您的帮助,但很抱歉,我很困惑。我的困惑是如何构造一个对象(通常,特别是 FunWithCalendars),如何调用 isValid 方法并让它不带任何参数,如何让 isValid 方法调用两个传递值的辅助方法在 FunWIthCalendars 对象中。
  • @ethana 请在答案底部附近查看我的编辑。
  • 感谢编辑解释!!它让我意识到我需要重新学习基础知识(对象、方法、参数、参数等),也让我意识到我认为的主要问题是:所以,我应该使用 FunWithCalendar 对象来输入日期的值。然后,在我的主要设计中,如何让我输入日期的对象使用 isValid 方法(不输入任何 args/参数)返回真或假(isValid 方法使用 2 个辅助方法来确定)?另外,你能解释一下“boolean computedValidity = test.isValid();”吗?它有什么作用/我把它放在哪里?
  • 对不起,@ethana。我已经编辑和解释了更多,但我的努力最好花在其他地方(其他问题上),所以我不会给你更多。我同意你阅读基础知识。快乐阅读、练习和学习。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多