Mockito从本地方法内部模拟对象

时间:2015-12-14 17:14:38

标签: java unit-testing junit mocking mockito

在我的课堂上,依赖项是由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"));

    }

}

1 个答案:

答案 0 :(得分:2)

您的问题是您的SystemUT课程没有注入其依赖项。你可以通过使用他们的JUnitRunner让 让Spring做到这一点,但它并不是真正的单元测试,因为你要让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类时,为其依赖项传递模拟对象:

@Mock
AccountLookupDAO daoMock;

@Mock
OrchService serviceMock;

private SystemUT sys;

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