当前位置: 代码迷 >> java >> 可以模拟System.identityHashCode吗?
  详细解决方案

可以模拟System.identityHashCode吗?

热度:36   发布时间:2023-07-26 14:51:39.0

美好的一天。

我有一个工具,通过向每个对象添加某些字节码生成的toString实现来检测项目中的对象。 生成的toString的逻辑无关紧要,但是重要的是它的返回值取决于在内部进行的System.identityHashCode调用。

现在,我想用自动化测试介绍生成的逻辑。 我创建了一个用于测试的类,为其生成了toString ,并希望对其toString输出进行断言。 显然,这种测试是不可重复的,因为System.identityHashCode在两次测试运行之间给出了不同的结果。

是否有可能模拟System.identityHashCode或稳定给出的结果?

可以使用Powermock进行此操作,如下所述:

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

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

我将介绍一个测试接缝:

@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,则结果需要保持一致,则可以在构造函数中使用替代 ,并让默认实现将传递为的 。

public YourWrapperClass(Object object) {
  this(object, System::identityHashCode);
}

/** Visible for testing. */
YourWrapperClass(Object object, ToIntFunction<Object> hashCodeFunction) {
  this.object = object;
  this.hashCodeFunction = hashCodeFunction;
}
  相关解决方案