Тестирование Hibernate с помощью Mockito

218
23 января 2018, 11:40
  StringBuilder request = new StringBuilder("exec dbo.MyClassOpenFunction");
            request.append(" '");
            request.append(userName);
            request.append("', ");
            request.append(sessionDay);
            request.append(", ");
            request.append(sessionId);
            Session currentSession = sessionFactory.getCurrentSession();
            MyClass myClass = (MyClass) currentSession.createSQLQuery(request.toString())
                    .uniqueResult();

Как правильно протестировать данный кусок кода с помощью Mockito

делаю так

 SessionFactory sessionFactory = Mockito.mock(SessionFactory.class);
       Session session = Mockito.mock(Session.class);
      Query  query = Mockito.mock(Query.class);
Mockito.when(sessionFactory.getCurrentSession()).thenReturn(session);
    Mockito.when(session.createQuery(any())).thenReturn(query);
    Mockito.when(query.uniqueResult()).thenReturn(new MyClass(1111, 20171111, "user_code"));

Но получаю

Caused by: java.lang.NullPointerException: null
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:159) ~[hibernate-core-4.2.15.Final.jar:4.2.15.Final]
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:183) ~[hibernate-core-4.2.15.Final.jar:4.2.15.Final]
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:157) ~[hibernate-core-4.2.15.Final.jar:4.2.15.Final]
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1881) ~[hibernate-core-4.2.15.Final.jar:4.2.15.Final]
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1858) ~[hibernate-core-4.2.15.Final.jar:4.2.15.Final]
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1838) ~[hibernate-core-4.2.15.Final.jar:4.2.15.Final]
    at org.hibernate.loader.Loader.doQuery(Loader.java:906) ~[hibernate-core-4.2.15.Final.jar:4.2.15.Final]
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:348) ~[hibernate-core-4.2.15.Final.jar:4.2.15.Final]
    at org.hibernate.loader.Loader.doList(Loader.java:2550) ~[hibernate-core-4.2.15.Final.jar:4.2.15.Final]
    at org.hibernate.loader.Loader.doList(Loader.java:2536) ~[hibernate-core-4.2.15.Final.jar:4.2.15.Final]
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2366) ~[hibernate-core-4.2.15.Final.jar:4.2.15.Final]
    at org.hibernate.loader.Loader.list(Loader.java:2361) ~[hibernate-core-4.2.15.Final.jar:4.2.15.Final]
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:340) ~[hibernate-core-4.2.15.Final.jar:4.2.15.Final]
    at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:1752) ~[hibernate-core-4.2.15.Final.jar:4.2.15.Final]
    at org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:232) ~[hibernate-core-4.2.15.Final.jar:4.2.15.Final]
    at org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:157) ~[hibernate-core-4.2.15.Final.jar:4.2.15.Final]
    at org.hibernate.internal.AbstractQueryImpl.uniqueResult(AbstractQueryImpl.java:909) ~[hibernate-core-4.2.15.Final.jar:4.2.15.Final]
Answer 1

Вы не описали возврат для вызова

currentSession.createSQLQuery(request.toString())

Ну и плюс где-то в недрах hibernate есть объект, который вам тоже надо мокнуть, но для начала надо выяснить какой и мокнуть всю цепочку =)

А в общем по вопросу:

Вам не надо тестировать объекты hibernate они уже оттестированы. Единственное тут написанное вами это построение request. Вынесите его в отдельный метод и протестируйте. Пытаться мокнуть весь hibernate на мой взгляд довольно трудоемко и не стоит таких усилий.

Проще и быстрее сделать полноценный тест со встроенной БД. Тест будет короче понятнее и возможно даже быстрее работать.

READ ALSO
Logback: почему не пишет в debug?

Logback: почему не пишет в debug?

Создал логирование через logback:

259
База данных в текстовом файле

База данных в текстовом файле

Создаю простое приложение которое должно хранить данные пользователя в текстовом файле (один для всех пользователей), авторизация также...

230
Проверка состояния

Проверка состояния

У меня есть сервер и клиент(Написанные на Java)

196
Обновление фрагментов View Pager

Обновление фрагментов View Pager

Как можно обновить все фрагменты view pager? То есть чтобы фрагменты создались заново, в том числе текущий

200