简体   繁体   English

Mockito:注入的模拟类不注入其他类

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM