如何在 Hamcrest 中使用(原始)自动装箱/加宽?

2024-04-22

我碰到https://code.google.com/p/hamcrest/issues/detail?id=130 https://code.google.com/p/hamcrest/issues/detail?id=130为 Hamcrest 匹配器添加一些糖语法。但这个想法遭到了 Hamcrest 开发商的拒绝。

还有其他聪明的想法可以通过避免在 long 后面输入 L 来使测试更具可读性吗?

@Test
public void test1() {
    int actual = 1;
    assertThat(actual, is(1));
}

@Test
public void test2() {
    long actual = 1L;
    assertThat(actual, is(1)); // fails as expected is <1> but result was <1L> 
    // assertThat(actual, is(1L)); off course works..
}

@Test
public void test3() {
    Long actual = new Long(1);
    assertThat(actual, is(1)); // fails as expected is <1> but result was <1L>
}

UPDATE

另请参阅下面比较时的差异,例如int 和 long 使用默认的 Java 语言 (==)、标准 junit 断言 (assertTrue) 和 hamcrest is() 方法。看起来很奇怪 hamcrest 不支持匹配/比较 long 与 int ,其余的都是。

@Test
public void test2() {
    long actual = 1L;
    int expected = 1;
    assertTrue(expected == actual); // std java succeeds
    assertEquals(expected, actual); // std junit succeeds
    assertThat(actual, is(expected)); // hamcrest fails: Expected: is <1> but: was <1L>
}

这与您链接的问题完全无关,该问题是关于解决错误的静态分析器并被正确拒绝的。您遇到的问题在 Java 中混合基本类型时很常见。

为了避免输入L你必须提供所有匹配器的重载版本——而不仅仅是is。考虑这些例子:

assertThat(longValue, greaterThan(1));
assertThat(longList, contains(1, 2, 3));

Update

您可以轻松添加自己的重载版本来执行转换:

public static Matcher<Long> is(Integer value) {
    return org.hamcrest.core.Is.is(value.longValue());
}

当然,既然你已经有了一个可以转换的int to long你会想要一些float and double:

public static Matcher<Long> is(Float value) {
    return org.hamcrest.core.Is.is(value.longValue());
}

public static Matcher<Long> is(Double value) {
    return org.hamcrest.core.Is.is(value.longValue());
}

由于 Java 不会自动转换为byte to Integer*,您还需要以下版本byte and short。这已经够难看的了,但是如果转换为其他类型呢?int to double?

public static Matcher<Double> is(Integer value) {
    return org.hamcrest.core.Is.is(value.doubleValue());
}

编译错误:重复方法为(Integer)

呃哦!这些不起作用,因为 Java 不允许您根据返回类型重载方法。您必须在我留给您的单独的类中声明这些方法。

考虑到这会造成巨大的混乱,我怀疑 Hamcrest 的作者会愿意接受这样的添加,因为回报很低。老实说,你最好使用明确的方式1L and 1.0如所须。

* 虽然编译器will转换自byte to int可以装箱到Integer.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Hamcrest 中使用(原始)自动装箱/加宽? 的相关文章

随机推荐

  • 如何实现一套?

    我想用C实现一个Set 创建 SET 时可以使用链表吗 还是应该使用其他方法 您通常如何实现自己的集合 如果需要 笔记 如果我使用链表方法 我的 Set 操作可能会遇到以下复杂性 初始化 O 1 销毁 O n 插入 O n 删除 O n 并
  • 如何在 Xcode 4 中使用 .xcconfig 文件?

    我刚刚切换到 Xcode 4 但在使用 xcconfig 文件进行构建设置时遇到问题 我的目标已经在 Xcode 3 中分配了文件 并且已全部设置完毕 标题为 Config file 的列显示在 构建设置 的 级别 视图中 但我不知道如何编
  • 如何创建一个修改结构体的函数

    我正在制作一个程序 使用结构将学生成绩放入数组中作为期末练习 我需要创建一个函数来检查数组中是否还有任何位置 如果没有 则数组的大小需要加倍 然后需要将成绩添加到下一个可用位置 如果数组有空缺职位 则应将等级值添加到下一个可用职位 每当数组
  • 如何确定我的应用程序是在 x86 还是 x64 Windows 上运行?

    我想知道 在运行时 我是在 32 位还是 64 位 Windows 上运行 OSVERSIONINFOEX 结构告诉我主要版本和次要版本 但我猜我需要内部版本号 有人知道它们是什么吗 如果您的应用程序是针对 64 位编译的 那么答案很简单
  • 测试登录用户在 Laravel 4 中具有正确的 id

    我正在尝试弄清楚如何测试 Laravel 4 中的登录用户是否可以访问正确的用户帐户 目前这就是我的routes php 文件中的内容 Route get user id array before gt auth function logg
  • 方案功能[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我试图解释这个方案函数的作用 define y s lis cond null lis equal s car lis lis else
  • 如何将 FragmentTabHost 选项卡放在屏幕底部?

    我已经尝试过以下代码 它对齐选项卡小部件上方的框架布局 但它仍然不起作用
  • 在 Android 中以编程方式添加 FilterChips

    我正在尝试做出一个有多种选择的芯片选择 就我而言 我将有动态选择 因此我必须动态创建芯片 我成功地动态创建了它 但由于多重选择需要一个名为style style Widget MaterialComponents Chip Filter 我
  • Linux 内核:为什么调用 kstrtol 会崩溃?

    我正在学习内核编程 并且对 kstrtol 进行了简单的调用 我用它来将字符串转换为数字 然而 每次我编译这个模块并使用 insmod 将其放入内核时 我都会收到 BUG 无法处理 f862b026 处的内核分页请求 然后是寄存器和堆栈转储
  • 对象不支持项目分配错误

    In my views py我在保存表单之前分配值 我以前是按以下方式做的 projectForm lat session results lat projectForm lng session results lng 现在 由于变量列表有
  • DACPAC 不包括复合对象

    我有一个 VS2012 数据库项目 其中包括表 存储过程 视图等 然后我有第二个数据库项目 其中包含对第一个项目的数据库引用 我已确保从 项目属性 gt 调试 gt 高级 菜单中选择 包括复合对象 选项 当我构建第二个项目并获取生成的 DA
  • 为什么我可以通过字符串索引来获取属性值但不能设置它?

    我试图解决这另一个问题的问题 https stackoverflow com questions 67809891 is it possible to reduce generic objects with unknown property
  • 如何在Android中制作倒计时器?

    我有两个 XML 格式的 EditText 在一个 EditText 中 用户可以输入一个数字作为分钟 在另一个 EditText 中输入一个数字作为秒 单击完成按钮后 EditText 应该开始倒计时并每秒更新其文本 此外 我怎样才能保持
  • 如何使用 T-SQL 或 .net 代码将 Mdf/ldf 数据库文件转换为 .bak 文件(数据库恢复)

    我有 sql server 数据库文件 Mdf Ldf 我想使用 T SQL 命令或 net 代码 C 或 Vb net 将它们转换为备份文件 有什么建议 thans BACKUP DATABASE NameOfDatabase TO DI
  • 使用套接字时避免垃圾收集

    在我的一个游戏项目中 我尽力避免创建对象 从而阻止垃圾收集器运行 这是一个网络游戏 我主要发送数据的字节数组 但也发送一些其他对象 例如 int 数组 我在分析 Eclipse 中的内存分配时注意到 通过我向套接字写入 读取的方式 在我的程
  • 无法使用变异成员...因为追加?

    我很困惑为什么会收到此错误 swift 4 2 1 next select only entries in range let filteredDataOpt TimeSeriesEntry filteredApps map data in
  • VS 2015 到 2017 迁移到包参考失败

    我继承了一个 VS 2015 C 应用程序 并希望将其迁移到 VS 2017 或 2019 它有一个包含 4 个包的 packages config 文件
  • R:循环数据框,根据日期提取数据子集

    我有一个大型数据框 其中包含如下所示的数据 date w x y z region 1 2012 01 21 43 12 3 NORTH 2 2012 02 32 54 21 16 NORTH 3 2012 03 14 32 65 32 N
  • Java中的构造函数和new运算符

    从类创建新对象Student在Java中我们通常使用以下语句 Student std new Student 我读过 new 运算符通过在堆中分配内存空间来创建新对象 但是我还读到调用构造函数Student 创建它 所以 这有点令人困惑 哪
  • 如何在 Hamcrest 中使用(原始)自动装箱/加宽?

    我碰到https code google com p hamcrest issues detail id 130 https code google com p hamcrest issues detail id 130为 Hamcrest