【问题标题】:Spring: right way to mock beansSpring:模拟 bean 的正确方法
【发布时间】:2014-07-01 15:58:34
【问题描述】:

我有:豆类

<bean id="abstractBean" class="com.package.MyBean" abstract="true"/>

<bean id="heirBean" parent="abstractBean">
    <property name="someProperty" ref="anotherBean">
</bean>

问题:如何模拟heirBean?或者换句话说如何模拟abstractBean


========================= 问题的可选部分 ================ ===============

我该如何尝试[例外]:

<bean id="abstractBean" class="MockFactoryBean">
    <property name="type" value="com.package.MyBean"/>
</bean>

MockFactoryBean.java

public class MockFactoryBean<T> implements FactoryBean<T> {
    private Class<T> type;

    public void setType(Class<T> type) {
        this.type = type;
    }

    @Override
    public T getObject() throws Exception {
        return Mockito.mock(type);
    }

    @Override
    public Class<T> getObjectType() {
        return type;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }

}

问题:我无法设置模拟字段。

【问题讨论】:

    标签: java spring unit-testing mockito spring-test


    【解决方案1】:

    有这个框架允许你在你的 spring xml 文件中添加模拟功能 - https://bitbucket.org/kubek2k/springockito/wiki/Home

    【讨论】:

    • @user346561 请在我的方法中遇到 springockito 的优势。我的意思是我的方法不能做到的。之后我会接受你的回答
    【解决方案2】:

    通常,您不会模拟父 bean,而是模拟每个要模拟的 bean。

    据我了解您的问题:

    • 你有很多豆子
    • 比使用一些常用功能
    • 您想模拟该常用功能

    虽然该理论通常不鼓励为测试进行重构,但测试的特定需求让您可以看到重构代码的方法。

    我建议:

    • 将通用功能移至单独的接口+实现
    • 将该功能注入所有使用它的 bean
    • 模拟常用功能

    因此,您将继承替换为使用,这使您具有更大的灵活性。

    【讨论】:

      【解决方案3】:

      我会使用 spring 的 profile 概念;从 spring 3.2.X 开始,Spring 中有“配置文件”概念,您可以使用它来模拟您的 bean 以用于测试范围

      【讨论】:

      • 但如果我需要模拟一两个 bean。为单个模拟创建单独的上下文不是很大的开销吗?
      • 你可以创建这个新的应用程序上下文(老实说,我使用注释,所以我不需要创建不同的应用程序上下文)并且你可以仅为测试用例加载新的上下文文件
      • 但是如果我有一个非常大的应用上下文,我需要重新定义它的单个 bean?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-05
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      相关资源
      最近更新 更多