[英]Mockito: injected mock class not injected for other classes
So I have a simple java class: 所以我有一个简单的java类:
@Component
public class IWantToTestThisClass {
@Autowired
private ClassA classA;
@Autowired
private ClassB classB;
public ObjectA doIt(...) {
classB.returnObject();
}
ClassA contains: ClassA包含:
@Component
public class ClassA {
@Autowired
private ClassB classB;
public ObjectA doIt() {
classB.returnObject(...);
}
ClassB: B类:
@Component
public class ClassB {
public ObjectA returnObject(...) {
...
}
My test setup looks like this: 我的测试设置如下:
@InjectMocks
private IWantToTestThisClass iWantToTestThisClass;
@Mock
private ClassA classA;
@Mock
private ClassB classB;
@Before
public void setUp() {
initMocks(this);
when(classA.doSmt()).thenCallRealMethod();
when(classB.doSmt()).thenCallRealMethod();
}
The problem is that ClassB is not injected for ClassA. 问题是没有为ClassA注入ClassB。
Then returnObject(ClassB) is called through classA it returns NullPointerException(ClassB is not mocked/injected). 然后,通过classA调用returnObject(ClassB),它返回NullPointerException(未模拟/注入ClassB)。
If returnObject(classB) is called through IWantToTestThisClass it is okay. 如果通过IWantToTestThisClass调用returnObject(classB)可以。
Is it a way to inject ClassB for both classes at the same time? 是否可以同时为两个类注入ClassB? I want to call real methods, not mocked ones.
我想调用真实方法,而不是模拟方法。
You 're injecting mock into IWantToTestThisClass, and not into ClassA. 您正在将模拟注入IWantToTestThisClass,而不是ClassA。 So there is no mock into ClassA and B isn't injected there.
因此,没有对ClassA的模拟,也没有在其中注入B。
Try to add @InjectMocks before classA 尝试在classA之前添加@InjectMocks
Or you can do : 或者您可以:
ClassB mB = Mockito.mock(ClassB.class);
classA.setClassB(mB);
if you add the setter setClassB(...) to ClassA 如果将setter setClassB(...)添加到ClassA
An @Autowired can be replaced by constructor inject. 可以将@Autowired替换为构造函数注入。 So, your classA will be:
因此,您的classA将是:
@Component
public class ClassA {
private static ClassB classB;
public ClassA(ClassB classB){
this.classB=classB;
}
public ObjectA doIt() {
classB.returnObject(...);
}
}
By this way you can inject the classB mock later in you @Before setUp method: 这样,您可以稍后在@Before setUp方法中注入classB模拟:
@Before
public void setUp() {
initMocks(this);
when(classA.doSmt()).thenCallRealMethod();
when(classB.doSmt()).thenCallRealMethod();
classB = new classB(classA);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.