【问题标题】:How would I do a unit test for the day of the month and the day of the week我将如何对一个月中的某一天和一周中的某一天进行单元测试
【发布时间】:2018-09-30 20:53:13
【问题描述】:

我想测试 java 日历的星期几和月份的星期几。在过去的几个小时里,我一直在试图弄清楚测试课程。 我想输入星期几的值并测试星期几是否会按预期出现。任何帮助将不胜感激。 我想我需要每天、每月和每年喂它一次,但我不知道该怎么做。 我需要在这个编码练习中使用日历。

到目前为止我的代码

import java.util.Calendar;
import java.util.Scanner;

public class dayOfWeek {


public static void main(String[] args) {    
    Calendar c = Calendar.getInstance(); 
    Scanner input = new Scanner (System.in);


    //Input Day
    System.out.println("Enter the Day (last two numbers) in number format:");
    int day= input.nextInt( );

    //Input Month
    System.out.println("Enter the Month (last two numbers) in number format:");
    int month= input.nextInt( );

    //Input Year
    System.out.println("Enter the Year (last two numbers) in number format:");
    int year= input.nextInt( );


    c.set(year, month, day);

    //Display the day
    int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);

    // Display Day of month
    int dayOfMonth = c.get(Calendar.DAY_OF_MONTH);

    //Print date in format
    System.out.println(String.format("%d/%d/%d",day,month,year));


    //if statement to print out day of week
    if (dayOfWeek == Calendar.SUNDAY) {
        System.out.println("Sunday");
    }
    else if (dayOfWeek == Calendar.MONDAY) {
        System.out.println("Monday");
    }
    else if (dayOfWeek == Calendar.TUESDAY) {
            System.out.println("Tuesday");
    }
    else if (dayOfWeek == Calendar.WEDNESDAY) {
                System.out.println("Wednesday");
    }
    else if (dayOfWeek == Calendar.THURSDAY) {
        System.out.println("Thursday");
    }
    else if (dayOfWeek == Calendar.FRIDAY) {
        System.out.println("Friday");
    }
    else if (dayOfWeek == Calendar.SATURDAY) {
        System.out.println("Saturday");






    //close Scanner in 
    input.close( );

   }

}

public static Object dayOfWeek(int i) {
    // TODO Auto-generated method stub
    return null;
}
}

【问题讨论】:

  • 将逻辑移动到方法中并传入 PrintStream 而不是硬编码 System.out 内联。 (并使用映射或数组而不是链接的ifs。)
  • 仅供参考,非常麻烦的旧日期时间类,例如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat,现在是 legacy,被 Java 8 中内置的 java.time 类所取代,之后。见Tutorial by Oracle

标签: java eclipse unit-testing


【解决方案1】:
  • 永远不要使用糟糕的Calendar 类。
  • 现代方法使用 java.time 类。

LocalDate

将您的三个整数解析为日期。如果输入无效,如果不存在这样的日期,则捕获引发的异常。将LocalDate 用于没有时间和时区的仅日期值。

try {
    LocalDate ld = LocalDate.of( y , m , d ) ;
} catch ( DateTimeException e ) {
    … handle invalid input …
}

DayOfWeek

使用 DayOfWeek 枚举(例如 DayOfWeek.MONDAY)传递您预期的星期几。

DayOfWeek dow = DayOfWeek.MONDAY ;  // Passed into your test.
if( ld.getDayOfWeek().equals( dow ) ) { … }

转换

如果您必须与尚未更新到java.time 的旧代码进行互操作,则可以来回转换。调用添加到旧类的新转换方法。

如果您需要Calendar,更具体地说是GregorianCalendar,我们需要时间和时区。

您可能希望利用一天中的第一刻。永远不要假设一天从 00:00:00 开始。夏令时 (DST) 等异常情况意味着一天可能从另一个时间开始,例如 01:00:00。让 java.time 确定第一个时刻。

continent/region 的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用 3-4 个字母的缩写,例如 ESTIST,因为它们不是真正的时区,没有标准化,甚至不是唯一的 (!)。

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;

现在转换。

Calendar c = GregorianCalendar.from( zdt ) ;  // Convert from modern class to legacy class. Do so only if absolutely required; otherwise, avoid the legacy date-time classes like the Plague. 

关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

  • 我需要使用日历类
  • @Mark 好的,我添加了一个“转换”部分。但我强烈建议你放弃 Date/Calendar/SimpleDateFormat 等这种糟糕的烂摊子。Sun、Oracle 和 JCP 社区几年前都放弃了这些课程,你也应该如此。
猜你喜欢
  • 2011-03-20
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多