У меня есть следующая (упрощенная) функция, которую я хочу проверить с помощью JUnit:
protected IDfCollection getCollection(IDfSession session) throws DfException{
IDfQuery dfcQuery = new DfQuery();
dfcQuery.setDQL(MY_DQL);
return dfcQuery.execute(session, IDfQuery.READ_QUERY);
}
Я успешно протестировал его с использованием реального IDfSession, но я хотел бы сделать это без подключения к репозиторию. Итак, я попытался издеваться над пустым IDfSession, используя:
IDfSession mockedSession = Mockito.mock(IDfSession.class);
Но мне дали NullPointerException:
Caused by: java.lang.NullPointerException
at java.util.StringTokenizer.<init>(StringTokenizer.java:182)
at java.util.StringTokenizer.<init>(StringTokenizer.java:204)
at com.documentum.fc.internal.util.SoftwareVersion.<init>(SoftwareVersion.java:53)
at com.documentum.fc.client.DfQuery.runQuery(DfQuery.java:136)
at com.documentum.fc.client.DfQuery.execute(DfQuery.java:208)
Не зная, что на самом деле пошло не так (какая функция фиктивного объекта вернула значение null, чего не ожидалось), я создал простой класс, реализующий интерфейс IDfSession, и использовал инструмент покрытия кода, чтобы проверить, какая функция была вызвана. Позже я надеялся поиздеваться над поведением функции, используя mockito. Я казался getServerVersion
, поэтому я изменил возвращаемое значение null на реальное значение "6.5.0.355 SP3P0600 Linux.Oracle"
. Следующей вызываемой функцией была getBatchManager
, поэтому здесь я также издевался над возвращаемым объектом. Но теперь я получаю:
Caused by: java.lang.ClassCastException: com.example.model.mock.IDfSessionMocked cannot be cast to com.documentum.fc.client.impl.session.ISession
Я попытался реализовать интерфейс ISession в классе IDfSessionMocked, но он не компилируется, например, потому что один из используемых типов (а именно com.documentum.fc.client.impl.session.ISessionListener) не виден.
Здесь: http://www.informedconsulting.nl/blog/?p=187 Я нашел информацию, как это сделать с помощью powerMock. Еще одно отличие состоит в том, что объект берется напрямую из сеанса без использования IDfQuery.
Что я должен делать?
Обновление после комментария
Функция getBatchManager была смоделирована, и теперь она возвращает анонимный объект внутреннего класса со всеми возвращаемыми значениями, равными false или 0, в зависимости от ожидаемого возвращаемого типа. Функция isFlushBatchOnQuery была вызвана в соответствии с инструментом покрытия.