首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从typeName测试中的模拟对象获取JUnit ()?

如何从typeName测试中的模拟对象获取JUnit ()?
EN

Stack Overflow用户
提问于 2015-08-05 19:48:49
回答 1查看 794关注 0票数 1

这是我不得不嘲笑的最奇怪的方法之一。我需要以某种方式将我的单元测试与以下代码协调起来:

代码语言:javascript
复制
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对象的代码:

代码语言:javascript
复制
@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():

代码语言:javascript
复制
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:

代码语言:javascript
复制
@Mock private java.beans.BeanInfo mockBeanInfo;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-05 21:46:07

让我们谈谈Java是什么

  1. 所有私有属性(使用getters/setters)
  2. 公共无参数构造函数
  3. 实现Serializable

换句话说,Bean只是一个数据结构。它没有任何行为,也没有你想要防止的意外后果。换句话说,您根本不应该嘲笑BeanInfo 上。

但是,您确实希望确保您的类对您的BeanInfo对象执行正确的操作。您希望在中获得生产代码和测试中的真实 BeanInfo对象,因为它是一种数据结构。因此,您真正需要的是一种在测试方法中访问这些真实BeanInfo对象的方法。

注意:您将无法避免在这里使用真正的Introspector,因为您的应用程序需要它提供的数据。

以下是我如何解决你的问题:

  1. 重构您的getBeanInfo()行为以使用单独的类BeanInfoProvider: 公共类SimpleBeanInfoProvider实现BeanInfoProvider {公共beanInfo getBeanInfo(Object obj) { beanInfo BeanInfo =空;尝试{ Class cls = obj.getClass();BeanInfo = Introspector.getBeanInfo(cls);} catch (IntrospectionException e) { e.printStackTrace();}返回beanInfo;}}
  2. 将此行为注入ClientViewer,可能是通过添加构造函数参数。 私有最终BeanInfoProvider提供程序;公共ClientViewer(.,BeanInfoProvider提供程序){ // snip this.provider = provider;}
  3. 更改使用BeanInfo的方法以使用此BeanInfoProvider 受保护的void (对象obj) {尝试{ BeanInfo beanInfo = provider.getBeanInfo(obj);// snip
  4. 创建一个BeanInfoProvider实现,生成间谍并允许您访问它们。注意:您需要缓存BeanInfo间谍,以确保在ClientViewer和测试方法中获得相同的间谍。 公共类SpyBeanInfoProvider实现BeanInfoProvider {私有最终BeanInfoProvider委托;私有最终BeanInfoProvider= obj.getClass();if(!spyMap.containsKey( klass )) { BeanInfo info =间谍(delegate.getBeanInfo(Obj));spyMap.put(klass,info);返回信息;} Map
  5. 把这个注射到你的测试中 BeanInfoProvider makeBeanInfoProvider() {返回新的SpyBeanInfoProvider(新的IntrospectorBeanInfoProvider());}@ testSub() { BeanInfoProvider provider = makeBeanInfoProvider();ClientViewer查看器=新的ClientViewer(makeBeanInfoProvider());viewer.sub(obj);BeanInfo间谍= provider.getBeanInfo(obj);//现在进行测试验证(间谍).getPropertyDescriptors();/等等。

这将允许您访问生成的BeanInfo对象--因为它们是真正的数据结构,实现为部分模拟,您将不再获得这些InvocationTargetException

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31841563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档