为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以模拟 System.identityHashCode?

是否可以模拟 System.identityHashCode?

幕布斯6054654 2022-06-15 16:36:49
再会。我有一个工具,它通过toString向每个对象添加某些字节码生成的实现来检测项目中的对象。生成的逻辑toString无关紧要,但重要的是它的返回值取决于System.identityHashCode内部进行的调用。现在我想用自动化测试来覆盖生成的逻辑。我创建了一个用于测试的类,为其生成toString并希望对其toString输出进行断言。很明显,这样的测试是不可重现的,因为System.identityHashCode在测试运行之间会给出不同的结果。是否有可能以某种方式模拟System.identityHashCode或稳定给出的结果?
查看完整描述

2 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

可以使用 Powermock 执行此操作,如下所述:如何使用 Mockito 模拟 System.getProperty

但是,更好的方法是创建一个包装类,System然后将包装器注入到您要测试的类中。

然后在您的单元测试中,您可以注入包装器的测试实现并控制系统的输出。


查看完整回答
反对 回复 2022-06-15
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

我将介绍一个测试接缝:


@Override public String toString() {

  return toString(System.identityHashCode(object));

}


/** Visible for testing. */

String toString(int hashCode) {

  // Your implementation here.

}

这样,您可以toString(int)从相邻的测试中调用任意多次,而无需担心 PowerMock 甚至 Mockito。


作为替代方案,如果 System.identityHashCode 在您的类中的其他地方使用,因此结果需要保持一致,您可以在构造函数中使用替换ToIntFunction,并让默认实现传递System.identityHashCode作为对静态方法的引用。


public YourWrapperClass(Object object) {

  this(object, System::identityHashCode);

}


/** Visible for testing. */

YourWrapperClass(Object object, ToIntFunction<Object> hashCodeFunction) {

  this.object = object;

  this.hashCodeFunction = hashCodeFunction;

}


查看完整回答
反对 回复 2022-06-15
  • 2 回答
  • 0 关注
  • 127 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号