簡體   English   中英

Mockito:注入的模擬類不注入其他類

[英]Mockito: injected mock class not injected for other classes

所以我有一個簡單的java類:

@Component
public class IWantToTestThisClass {

@Autowired
private ClassA classA;

@Autowired 
private ClassB classB;

public ObjectA doIt(...) {
   classB.returnObject();
}

ClassA包含:

@Component
public class ClassA { 

@Autowired 
private ClassB classB;

public ObjectA doIt() {
   classB.returnObject(...);
}

B類:

@Component
public class ClassB { 

public ObjectA returnObject(...) {
   ...
}

我的測試設置如下:

@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();
}

問題是沒有為ClassA注入ClassB。

然后,通過classA調用returnObject(ClassB),它返回NullPointerException(未模擬/注入ClassB)。

如果通過IWantToTestThisClass調用returnObject(classB)可以。

是否可以同時為兩個類注入ClassB? 我想調用真實方法,而不是模擬方法。

您正在將模擬注入IWantToTestThisClass,而不是ClassA。 因此,沒有對ClassA的模擬,也沒有在其中注入B。

嘗試在classA之前添加@InjectMocks

或者您可以:

ClassB mB = Mockito.mock(ClassB.class);
classA.setClassB(mB);

如果將setter setClassB(...)添加到ClassA

可以將@Autowired替換為構造函數注入。 因此,您的classA將是:

@Component
public class ClassA { 

    private static ClassB classB;

    public ClassA(ClassB classB){
        this.classB=classB;
    }

    public ObjectA doIt() {
       classB.returnObject(...);
    }
}

這樣,您可以稍后在@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