3 回答
TA贡献1898条经验 获得超8个赞
就我而言,我正在寻找一种在单元测试中摆脱这种情况的方法:
Point p = getAPoint();
assertEquals(p.getX(), 4, "x");
assertEquals(p.getY(), 6, "x");
如您所见,有人正在测试Method getAPoint并检查坐标是否符合预期,但是在每个断言的描述中均已复制并且与所检查的内容不同步。最好只写一次。
根据@ddan的想法,我使用Mockito构建了代理解决方案:
private<T> void assertPropertyEqual(final T object, final Function<T, ?> getter, final Object expected) {
final String methodName = getMethodName(object.getClass(), getter);
assertEquals(getter.apply(object), expected, methodName);
}
@SuppressWarnings("unchecked")
private<T> String getMethodName(final Class<?> clazz, final Function<T, ?> getter) {
final Method[] method = new Method[1];
getter.apply((T)Mockito.mock(clazz, Mockito.withSettings().invocationListeners(methodInvocationReport -> {
method[0] = ((InvocationOnMock) methodInvocationReport.getInvocation()).getMethod();
})));
return method[0].getName();
}
不,我可以简单地使用
assertPropertyEqual(p, Point::getX, 4);
assertPropertyEqual(p, Point::getY, 6);
并确保断言的描述与代码同步。
缺点:
会比上面稍微慢一点
需要Mockito工作
除上述用例外,对其他任何功能几乎没有用。
但是,它确实显示了一种方法。
添加回答
举报