这是我不得不模拟的最奇怪的方法之一。我需要以某种方式将我的单元测试与以下代码相协调:
protected void sub(Object obj) {
try {
BeanInfo beanInfo = getBeanInfo(obj);
for (PropertyDescriptor pb : beanInfo.getPropertyDescriptors()) {
String fieldType = pd.getPropertyType.getTypeName();
System.out.println(fieldType);
}
} catch (InvocationTargetException | IllegalAccessException e) {
e.printStackTrace();
}
}
看起来它可能是一个简单的单元测试(我将 getBeanInfo() 移到一个单独的方法中,这样我就可以模拟它而不会绊倒 Introspector)。但是,每当我到达 getTypeName() 时,它总是会抛出 InvocationTargetException。有没有办法以某种方式模拟 PropertyDescriptor 的属性类型?我在stackoverflow上找到了一个解决方案,但它并没有太大帮助。
带有 Mockito.when() 和泛型类型推断的奇怪泛型边缘案例
这是我如何模拟 BenInfo 对象的代码:
@Test
public void testSub() {
ClientViewer cv = mock(ClientViewer.class); // The class that I'm testing.
when(cv.getBeanInfo(mockValue)).thenReturn(mockBeanInfo);
// Rest of the test.
}
mockValue 对象只是一个通用对象。mockBeanInfo 对象是不言自明的。这段代码确实有效。问题是模拟 PropertyDescriptor 名称。
这是 getBeanInfo():
protected BeanInfo getBeanInfo(Object obj) {
BeanInfo beanInfo = null;
try {
Class cls = obj.getClas();
beanInfo = Introspector.getBeanInfo(cls);
} catch (IntrospectionException e) {
e.printStackTrace();
}
return beanInfo;
}
最后是 mockBeanInfo:
@Mock private java.beans.BeanInfo mockBeanInfo;