当前位置: 首页 > 知识库问答 >
问题:

使用带有布尔输出的Int输入测试日期是否有效的类,以及如何测试(java)

龙令雪
2023-03-14

我有一个类的赋值,我必须创建一个类(称为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;
         }
     }
     
}
     

}
}

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

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

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

好吧,这让人困惑。让我们再试一次:

一年是闰年,如果:

a、 它可以被400整除

b、 它可以被4整除,也不能被100整除。

根据这些规则,1512年、1600年和2000年是闰年。1514年、1700年和1900年并非如此。

(你认为闰年只是每四年一次!朱利叶斯·凯撒的日历就是这样,这是错误的,因为每四年加上366天,我们一年的平均长度是365.25天,而不是更精确的365.2425天。每年0.0075天听起来不算多,但在16世纪天文学家注意到了这一点。)可预测的事件,如至点和春分,大约在10天内“停止”。因此有了新的、经过改进的日历。)

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

月份名称天数

1月31日

2月28日或29日

3月31日

4月30日

5月5日至31日

6月30日

7月31日

8月8日31日

9月30日

10月10日至31日

11月11日30日

12月31日

根据公历的闰年规则和通常的每月天数,用日历完成课程。你需要:

三个整型字段变量,用于跟踪月份、日期和年份。

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

方法:

布尔值

它将返回一个真或假。如果结果为真,则表示月份和日期是该年的有效值。

您将需要三种助手方法:

布尔isLeapYear()

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

你还需要:

布尔值isValidMonth()

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

布尔值isValidDay()

只有在给定年份的该月存在该日时,才会返回true。当检查29在2月份是否有效时,记得检查闰年!

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

测验:

2010年7月20日有效。

13/1/2009无效。(13不是有效的月份。)

2009年11月31日无效。(该月不存在该日。)

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

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

*/

感谢所有能帮忙的人!

共有1个答案

端木震博
2023-03-14

让我们以第一次测试为例:

测验:

2010年7月20日有效。

因此,在你的驱动程序类/测试类中,构造一个FunWithCalendars对象,表示2010年7月20日。为此,构造函数接受三个参数。接下来调用它的isValid方法。我相信这个想法是,你不应该再通过同样的论点。您的isValid方法接受两个boolean参数。相反,我认为它不应该接受任何参数,而应该调用两个helper方法来传递FunWithCalendars对象中已经存在的值。所以,在你可以让你的驱动程序类开始工作之前,我相信你必须在这一点上修正你的设计。

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

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

编辑:

...我的困惑在于如何构造一个对象(一般来说,也特别是FunWitCalendars),如何调用isValid方法并让它不接受任何参数,如何让isValid方法调用传递FunWIthCalendars对象中的值的两个助手方法。

这是基础知识,我不认为堆栈溢出是教授基础知识的好地方。让我们试一试,只是请把你的期望设定得低一点。

如何构造对象:您已经在driver类中使用new操作符执行此操作:

    FunWithCalendars test = new FunWithCalendars () ;

只需要将正确的参数传递给构造函数。您的构造函数接受三个int参数,因此它需要类似于:

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

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

    boolean calculatedValidity = test.isValid();

这将从isValid()falseortrue)返回的值存储到一个新创建的boolean变量中,我已将该变量命名为计算有效性。从那里我们可以检查它是否具有预期值,根据它进行操作和/或打印它。最简单的事情是打印它,例如:

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

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

public boolean isValid () 
{ 

如何让isValid()调用这两个helper方法:您可以简单地编写方法调用,而不必提及之前的参数。再次记住传递正确的参数:

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

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

我已经用上面的更改运行了你的代码。我的打印声明打印了预期的:

Is 7/20/2020 valid? true

PS我故意不说任何关于代码中可能存在的错误的事情。最好让你的测试告诉你是否有。

 类似资料:
  • 问题内容: 在我正在构建的网站的首页上,有几个使用CSS伪类在鼠标悬停在它们上方时添加边框。的其中一个包含,如果其中的输入具有焦点,则使用jQuery使用jQuery保留边框。除了IE6不支持s之外的任何其他元素,这都可以正常工作。因此,仅对于此浏览器,我们使用jQuery使用该方法来模仿CSS 。唯一的问题是,现在jQuery同时处理了form和,当输入具有焦点时,用户将鼠标移入和移出,边框就会

  • 问题是,在您的应用程序项目中拥有一个除了为您的测试项目生成数据之外没有其他目的的方法是否是一种糟糕的做法。

  • 好吧,所以我正在做这个项目,你必须做一些来自用户的输入 让我们说如果他进入 "12 3" 但他没有输入第二个输入 如果我把它叫做 如果我打电话 我有错误。我如何检查是否没有第二次输入? 公共静态void main(String [] args)引发IOException{ 如果用户输入 "3 2" 但没有进入第二个...我得到nullpointerx0016

  • 我一直在学习用C++中的Google测试进行单元测试。 如果单元测试的目的是确保代码的某些段或对象按照预期的方式工作,那么我认为没有必要在最终项目中编译和导出单元测试代码,对吗?反正用户也不会使用它。它似乎使项目的规模变得不必要的大。 我的主要问题是:所有的单元测试代码会随最终项目一起编译导出吗,还是在导出之前我必须手动删除所有的单元测试? 对于单元测试和导出项目,是否有一个最佳的(或通用的)实践

  • 除了统一的HTML或XML报告之外,我如何获得Spock测试执行控制台输出或类似于我的应用程序日志? 使用Gradle2.11和Log4j支持的Slf4j。

  • 我试图用Junit测试内部有布尔条件的void方法 在这种情况下,当verifyName()使用JUnit返回时,测试void方法的最佳方法是什么?? 预期测试场景: verifyName()返回--