【问题标题】:Mock testing a dependency-injected object模拟测试依赖注入的对象
【发布时间】:2012-11-28 22:03:25
【问题描述】:

我有如下四个类:

public class A(){

  public void getOne(){

    B objB = new B();
    String x = objB.getTwo();
  }
}



public class B(){

  public String getTwo(){

    C objC = new C();
    return objC.getThree();
  }
}


public class C(){

  D objD;

  public String getThree(){

    return objD.getFour();
  }
}

public class D(){

  public String getFour(){

    return "hi";
  }
}

在上面的代码中,C 类有 objD,它是由 Spring 注入的。当我尝试测试A 类的getOne() 方法时,我得到一个空指针异常,因为当方法调用到达C 类时,它没有实例化objD(因此出现异常)。如果子子类具有该子子类被Spring依赖注入的方法,我该如何测试这些方法?

【问题讨论】:

    标签: java spring testing dependency-injection mocking


    【解决方案1】:

    测试失败了,这是一件好事,因为 Spring 无法将依赖项注入到它不是自己创建的对象中。如果你在做new C(),Spring 对此一无所知,并且永远不会在这个 C 实例中注入 objD

    D应该注入C,B应该注入B,B应该注入A。这样,你可以通过注入一个mock B来测试A;您可以通过注入模拟 C 来测试 B,也可以通过注入模拟 D 来测试 C。

    【讨论】:

      【解决方案2】:

      虽然对象C 可能是Spring 注入的,但您在B(因此A)中没有意识到它,因为您使用new 运算符来实例化C,Spring 不会拦截它没有其他库的帮助(我假设你没有使用)。

      new 在涉及控制反转时是一个肮脏的词,我在AB 都看到了它。

      理想情况下,当您为A 编写测试时,您不想依赖它不知道的任何内容(在本例中为CD)。您可能想要模拟/存根B 的实例并将其注入A。对于C,我建议对B 执行相同的操作。

      【讨论】:

        猜你喜欢
        • 2019-11-27
        • 1970-01-01
        • 2013-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多