问题描述
美好的一天。
我有一个工具,通过向每个对象添加某些字节码生成的toString
实现来检测项目中的对象。
生成的toString
的逻辑无关紧要,但是重要的是它的返回值取决于在内部进行的System.identityHashCode
调用。
现在,我想用自动化测试介绍生成的逻辑。
我创建了一个用于测试的类,为其生成了toString
,并希望对其toString
输出进行断言。
显然,这种测试是不可重复的,因为System.identityHashCode
在两次测试运行之间给出了不同的结果。
是否有可能模拟System.identityHashCode
或稳定给出的结果?
1楼
可以使用Powermock进行此操作,如下所述:
但是,更好的方法是创建一个包装System
的类,然后将包装器注入到您要测试的类中。
然后,在单元测试中,您可以注入包装程序的测试实现并控制System的输出。
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,则结果需要保持一致,则可以在构造函数中使用替代 ,并让默认实现将传递为的 。
public YourWrapperClass(Object object) {
this(object, System::identityHashCode);
}
/** Visible for testing. */
YourWrapperClass(Object object, ToIntFunction<Object> hashCodeFunction) {
this.object = object;
this.hashCodeFunction = hashCodeFunction;
}