Присвоение нулевого объекта во время выполнения тестового метода

Используя 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 для справочных типов).

Другие вопросы по тегам