Присвоение нулевого объекта во время выполнения тестового метода
Используя 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
является нулевым, вызывая NullPointerException
при попытке доступа к getWithCriterion
метод.
Изменить: это где ccrQueueDAO инициализируется в DataMgmtWebServiceImpl
@PostConstruct
public void init() {
ccrQueueDAO = new CCRQueueDAO(props.getDbConnectionString(),
props.getDbLogin(), props.getDbPass());
}
1 ответ
Насмешки - не волшебство, они как любой другой объект Java. Если вы хотите DataMgmtWebServiceImpl
класс, чтобы использовать ваши издевательства CCRQueueDAO
объект, то вам нужно будет передать mockCCRQueueDAO
возражать в testObject
как-то. Более вероятный DataMgmtWebServiceImpl
должен иметь конструктор, который принимает CCRQueueDAO
и вы можете построить его с помощью макета поля в @Before
метод в вашем тесте.
Вам нужно использовать @Before
метод, так как он будет работать после MockitoJunitRunner
инициализировал @Mock
поля. Если вы попытаетесь получить доступ к @Mock
поле во время инициализации вашего класса (например, в инициализаторе поля), то @Mock
поле по-прежнему будет иметь значение по умолчанию (которое null
для справочных типов).