簡體   English   中英

從本地方法內部模擬對象的Mockito

[英]Mockito mocking objects from inside local method

在我的課程中,依賴項是由Spring注入的。 在測試期間,我正在使用模擬。 在以下代碼中調用sys.getId("abc12345")時,出現空指針異常。 我想知道如何編寫獲得100%覆蓋率的單元測試。

被測課程

public class SystemUT implements SUTIface{

    @Inject 
    private AccountLookupDAO dao;

    @Inject 
    private OrchService service;

    public Response perform(Request req){
        String sellerId = getId(request.getSeller().getNum());

        String buyerId = null;

        if(req.getBuyerId){
            buyerId = getId(request.getBuyer().getNum())
        }

            service.execute(Request,sellerId,buyerId)

    }

    String getId(String num){
        PrefAcct prefAcctObj = dao.lookupPrefId(num,Consants.StrArr);
        PrefSysOfRecObj sorObj= prefAcctObj.getSysOfRecord();
        return sorObj.getId();
    }

}

單元測試

public Class SystemUTTest{

    @Mock
    SystemUT sys;

    @Mock
    AccountLookupDAO daoMock;

    @Mock
    OrchService serviceMock;

    @Mock
    PrefAcct prefAcctObj;

    @Mock
    PrefSysOfRecObj sorObj;

    @Before
    public void setup(){
        Whitebox.setInternalState(sys, daoMock, serviceMock);
    }

    @Test
    public test getId(){

        when(dao.lookupPrefId(any(String.class), any(String[].class))).thenReturn(prefAcctObj);
        when(prefAcctObj.getSysOfRecord()).thenReturn(sorObj);
        when(sorObj.getId()).thenReturn("185");

         assertEquals("185",sys.getId("abc12345"));

    }

}

您的問題是您的SystemUT類沒有注入其依賴項。 可以讓Spring使用其JUnitRunner來執行此操作,但這實際上並不是單元測試,因為您將讓Spring決定注入哪些依賴項。 確實,您想要控制它們,並且做到這一點的一種方法是將類轉換為通過構造函數公開其依賴項:

public class SystemUT implements SUTIface{

    private final AccountLookupDAO dao;
    private final OrchService service;

    @Inject 
    public SystemUT(AccountLookupDAO dao, OrchService service) {
        this.dao = dao;
        this.service = service;
    }
}

由於Spring能夠使用@Inject注釋的構造函數來注入依賴項,因此其功能與您當前的方法相同。 現在,當實例化SystemUT類進行測試時,傳遞SystemUT對象的依賴關系:

@Mock
AccountLookupDAO daoMock;

@Mock
OrchService serviceMock;

private SystemUT sys;

@Before
public void setup(){
    sys = new SystemUT(daoMock, serviceMock);
    Whitebox.setInternalState(sys, daoMock, serviceMock);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM