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