0

I have four classes like below:

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";
  }
}

In the above code, class C has objD which is being injected by Spring. When I try to test the getOne() method of class A, I get a null pointer exception because when the method call reaches class C, it has no objD instantiated (hence the exception). How can I test such methods where the sub-sub class has a method where that sub-sub class is dependency-injected by Spring?

4

2 回答 2

1

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

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

于 2012-11-28T22:11:16.777 回答
0

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

new当涉及到控制反转时,这是一个肮脏的词,我在A和中都看到了它B

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

于 2012-11-28T22:11:49.090 回答