这是我不得不嘲笑的最奇怪的方法之一。我需要以某种方式将我的单元测试与以下代码协调起来:
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()时,它都会抛出一个getTypeName。是否有一种方法来模拟PropertyDescriptor的属性类型?我在这里找到了一个关于堆栈溢出的解决方案,但是它没有多大帮助。
带有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;发布于 2015-08-05 21:46:07
Serializable。换句话说,Bean只是一个数据结构。它没有任何行为,也没有你想要防止的意外后果。换句话说,您根本不应该嘲笑BeanInfo 在上。
但是,您确实希望确保您的类对您的BeanInfo对象执行正确的操作。您希望在中获得生产代码和测试中的真实 BeanInfo对象,因为它是一种数据结构。因此,您真正需要的是一种在测试方法中访问这些真实BeanInfo对象的方法。
注意:您将无法避免在这里使用真正的Introspector,因为您的应用程序需要它提供的数据。
以下是我如何解决你的问题:
getBeanInfo()行为以使用单独的类BeanInfoProvider:
公共类SimpleBeanInfoProvider实现BeanInfoProvider {公共beanInfo getBeanInfo(Object obj) { beanInfo BeanInfo =空;尝试{ Class cls = obj.getClass();BeanInfo = Introspector.getBeanInfo(cls);} catch (IntrospectionException e) { e.printStackTrace();}返回beanInfo;}}ClientViewer,可能是通过添加构造函数参数。
私有最终BeanInfoProvider提供程序;公共ClientViewer(.,BeanInfoProvider提供程序){ // snip this.provider = provider;}BeanInfo的方法以使用此BeanInfoProvider
受保护的void (对象obj) {尝试{ BeanInfo beanInfo = provider.getBeanInfo(obj);// snipBeanInfoProvider实现,生成间谍并允许您访问它们。注意:您需要缓存BeanInfo间谍,以确保在ClientViewer和测试方法中获得相同的间谍。
公共类SpyBeanInfoProvider实现BeanInfoProvider {私有最终BeanInfoProvider委托;私有最终BeanInfoProvider= obj.getClass();if(!spyMap.containsKey( klass )) { BeanInfo info =间谍(delegate.getBeanInfo(Obj));spyMap.put(klass,info);返回信息;} Map这将允许您访问生成的BeanInfo对象--因为它们是真正的数据结构,实现为部分模拟,您将不再获得这些InvocationTargetException。
https://stackoverflow.com/questions/31841563
复制相似问题