在测试方法执行期间,模拟对象为null

时间:2015-12-02 03:35:30

标签: java junit mockito

使用 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());
}

1 个答案:

答案 0 :(得分:0)

模拟不是魔术,它们就像任何其他Java对象一样。如果您希望DataMgmtWebServiceImpl类使用模拟的CCRQueueDAO对象,那么您需要以某种方式将mockCCRQueueDAO对象传递给testObject。最有可能DataMgmtWebServiceImpl应该有一个带CCRQueueDAO的构造函数,您可以在测试中使用@Before方法中的模拟字段构建它。

您需要使用@Before方法,因为它会在MockitoJunitRunner初始化@Mock字段后运行。如果您在初始化类期间尝试访问@Mock字段(例如在字段初始值设定项中),则@Mock字段仍将具有其默认值(对于引用类型为null