仅使用AndroidJunit4时,日历测试通过
我有个奇怪的案子。我正在运行一个本地测试,并在该测试中使用Calendar类 使用仅使用AndroidJunit4时,日历测试通过,android,unit-testing,kotlin,junit4,Android,Unit Testing,Kotlin,Junit4,我有个奇怪的案子。我正在运行一个本地测试,并在该测试中使用Calendar类 使用@RunWith(AndroidJUnit4::class)注释测试类时,测试通过,否则测试失败 测试代码不包括任何Android环境库 这是我的班级 class MyDateUtils(private val calendar: Calendar) { fun getDates(): Long{ calendar.set(Calendar.DAY_OF_WEEK, Calendar.SU
@RunWith(AndroidJUnit4::class)
注释测试类时,测试通过,否则测试失败
测试代码不包括任何Android环境库
这是我的班级
class MyDateUtils(private val calendar: Calendar) {
fun getDates(): Long{
calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY)
return calendar.timeInMillis
}
}
这是测试用例,这个通过了
@RunWith(AndroidJUnit4::class)
class MyDateUtilsTest {
private lateinit var calendar: Calendar
private lateinit var dateUtils: MyDateUtils
@Before
fun init() {
calendar = Calendar.getInstance()
calendar.timeInMillis = 1592422768000
dateUtils = MyDateUtils(calendar)
}
@Test
fun `when get dates is called with wednesday day should return sunday of the same week`() {
val expected = 1592163568000
val actual = dateUtils.getDates()
assertEquals(expected, actual)
}
}
现在,当我删除@RunWith(AndroidJUnit4::class)
时,测试失败,出现以下错误消息java.lang.AssertionError:Expected:1592163568000实际:1592768368000
另外,预期的行为是
getDates()
方法在同一周内返回Sunday。但是如果不使用@RunWith(AndroidJUnit4::class)
它将在下一个星期日(下周)返回。这可能与使用AndroidJUnit4运行时可能更改的默认区域设置有关
对于不同的区域设置,一周的第一天是不同的,这可能会导致测试失败或通过,具体取决于运行者。我想这可能是某个地方的区域设置问题,因为在计算机而不是设备上运行测试。设置当前时间后,如果在设置日期之前调用
getTimeInMillis
,是否会使其保持一致?您好,感谢您的评论。我不知道你到底想让我试试什么。您能澄清一下吗?这可能与使用AndroidJUnit4运行时可能更改的默认语言环境有关。我想知道一周的第一天是否会有所不同,这取决于你是否在跑步。1.您可以编写一些调试语句来回答这个问题。2.你能发布计算日期的代码吗?(什么计算由getDates()
返回的值)。您好,@PedroLoureiro。我认为你是对的。这与语言环境有关。我在这两种情况下都尝试过调试,并检查了val first=calendar.firstDayOfWeek
,发现结果不同,所以在测试中,我设置了如下区域设置locale=locale(“US”)calendar=calendar.getInstance(locale)
,并通过了测试。考虑把这个写为答案,我会把它标记为正确的。谢谢我说的是日历。timeInMillis=1592422768000;calendar.getTimeInMillis();dateUtils=MyDateUtils(日历)让它工作吗Calendar
s是使用当前时间(取决于区域设置)创建的,当您设置timeInMillis
时,直到调用get
方法,它才真正得到重新计算。因此,当您设置时间,然后设置日期时,挂起的时间更改可能会被覆盖/忽略。设置时间后调用get
方法会将其锁定<代码>日历既奇怪又复杂