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

测试SimpledateFormat时的JUnit AssertionError

冯德佑
2023-03-14

使用JUnit4.12和AndroidStudio,我试图测试下面的方法,结果似乎是匹配的。我不知道为什么我得到了java.lang.AssertionError

测试方法:

public String dateNow() {
    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy_hh-mm-ss");
    String date = sdf.format(new Date());
    return date;
}

我的测试类:

private Addons mAddons;

@Before
public void setUp() throws Exception{
    mAddons = new Addons();
}

@Test
public void testDateNow() throws Exception {

    final String reality = mAddons.dateNow().substring(0,10);
    final String expected = "09-08-2017";
    assertSame("testDateNow() :", expected, reality);
}

控制台输出:

java.lang.AssertionError: testDateNow() : expected same:<09-08-2017> was not:<09-08-2017>

Expected :09-08-2017
Actual   :09-08-2017

我不知道它为什么会失败。谁能为我指明正确的方向?

共有3个答案

刘才俊
2023-03-14

虽然您的逻辑是正确的,但您在测试中使用了错误的断言。assertSame的文档说明它断言两个对象必须引用同一个对象。这意味着这两个对象必须引用同一个对象。

当您将reality赋给字符串“09-08-2017”时,变量reality现在引用了内存中包含值“09-08-2017”对象

maddons.dateNow().substring(0,10)生成另一个具有相同值的对象“09-08-2017”,因此expected具有相同的值,但它不引用内存中的相同对象。

要断言值是相同的,您应该使用assertEquals,它将测试值是否相等,而不是引用。

这是Java中比较字符串时非常常见的错误。

我建议你也读下面这篇文章:Java字符串比较

牛兴安
2023-03-14

这两个日期的toString()方法打印的是相同的东西,但是它们引用的对象可能不同。

胡弘毅
2023-03-14

assertSame检查两个参数是否是同一个对象。但他们不是。

如果您想检查它们是否具有相同的内容,则应该改用assertEquals。

 类似资料:
  • 问题内容: 我有一个将a解析为: 当我解析这个: 结果将是,当使用时: 8月29日 2011 00:44:00 当然,这应该是: 8月29日 2011 12:44:00 当我解析这个: 然后结果如预期的那样: 8月29日 2011 13:44:00 我怎样才能解决这个问题? 问题答案: 使用代替小时模式:

  • java.text.SimpleDateFormat类根据给定的模式格式化日期。 它还用于解析字符串中的日期,其中字符串包含所提及格式的日期。 请参阅以下使用SimpleDateFormat类的示例。 IOTester.java import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.

  • 问题内容: 我一直在尝试隔离应用程序中的错误。我成功产生了以下“谜语”: 在Android API 7上 运行此代码时,我得到了注释中的值(是的,是的)。此行为取决于特定的Java实现。 我的问题是: 为什么s1不等于s2? 更重要的是, 为什么s1不正确? 虽然指向适当的时间点,但没有。Android的SimpleDateFormat实现中似乎存在一个错误。 问题1 的答案 : 请参阅Balus

  • 问题内容: 我不需要整个故事来澄清我的问题,所以我只显示代码(仅是示例)。我的结果怎么会有差异? 码 输出量 问题答案: 如果您在伦敦或巴黎,则时区为1970年1月1日GMT + 1。 由于@ARC在评论中解释的原因,英国于1968年2月18日至1971年10月31日使用了GMT + 1或UTC + 1 我可以转换很长时间而不会干扰任何时区吗? 将TimeZone设置为GMT。 版画

  • 第二个选项(来自Java SimpleDateFormat(“yyyy-mm-dd't'hh:mm:ss'z'”)将时区作为IST提供) 在这两种情况下,时间都错了。我的笔记本电脑或手机显示的不是当地时间,但输出时间是提前2小时。我怎么才能改变呢?我想有柏林(CEST)的当前时间也显示在我的电脑上。我感谢每一个评论。

  • 在本教程中,我们将演示如何在TestNG中执行超时测试。 “超时”表示如果单元测试花费的时间超过指定的毫秒数,那么TestNG将会中止它并将其标记为失败。 “超时”也可用于性能测试,以确保方法在合理的时间内返回。 创建一个名称为:TimeoutTest 的 Maven 项目,其结构如下所示 - 创建一个测试类:TestTimeout.java,其代码如下 - 执行上面代码,得到以下结果 -