使用 JUnit 和 Mockito 我有一个在测试中实例化的测试对象,但是在运行实际方法时它是null。请允许我演示:
@RunWith(MockitoJunitRunner.class)
public class TestDataMgmtWebServiceImpl {
@Mock
CCRQueueDAO mockCCRQueueDAO;
DataMgmtWebServiceImpl testObject = new DataMgmtWebServiceImpl();
...
@Test
public void testFindBySCAC() {
QueueByScacReq testReq = new QueueByScacReq();
testReq.setAfterThis(DatabasetoSOAP.calFromSQLDate(new Date(
System.currentTimeMillis())));
testReq.setScac("asdf");
testReq.setStatus("fdsa");
List<CCRQueueInfo> testInfos = TestObjects.createQueueInfoList(3);
when(mockCCRQueueInfoDAO.getWithCriterion(testReq.getScac(),
testReq.getStatus, SOAPToDatabase.sqlDateFromCal(testReq.getAfterThis(), null);
QueueListResp actual = testObject.findChangeByScac(testReq);
assertEquals(testinfos.get(1).getRequestorEmail(),
actual.getQueueList().get(1).getRequestorEmail());
}
}
DataMgmtWebServiceImpl.findChangeReqByScac
public QueueListResp findCHangeReqBySCAC(QueueByScacReq request) {
QueueListResp response = new QueueListResp();
for (CCRQueueInfo q : ccrQueueDAO.getWithCriterion(request.getScac(),
request.getStatus, SOAPToDatabase.sqlDateFromCal(request.getAfterThis()), null) {
response.getQueueList().add(DatabaseToSOAP.fromDBCCRQueueInfo(q));
}
return response;
}
测试方法mockCCRQueueInfoDAO
中的被定义为模拟对象。很遗憾ccrQueueDAO
中的findChangeReqBySCAC
null ,在尝试访问NullPointerException
方法时导致getWithCriterion
。
编辑:这是在DataMgmtWebServiceImpl中初始化ccrQueueDAO的地方
@PostConstruct
public void init() {
ccrQueueDAO = new CCRQueueDAO(props.getDbConnectionString(),
props.getDbLogin(), props.getDbPass());
}
答案 0 :(得分:0)
模拟不是魔术,它们就像任何其他Java对象一样。如果您希望DataMgmtWebServiceImpl
类使用模拟的CCRQueueDAO
对象,那么您需要以某种方式将mockCCRQueueDAO
对象传递给testObject
。最有可能DataMgmtWebServiceImpl
应该有一个带CCRQueueDAO
的构造函数,您可以在测试中使用@Before
方法中的模拟字段构建它。
您需要使用@Before
方法,因为它会在MockitoJunitRunner
初始化@Mock
字段后运行。如果您在初始化类期间尝试访问@Mock
字段(例如在字段初始值设定项中),则@Mock
字段仍将具有其默认值(对于引用类型为null
)