when () требует аргумента, который должен быть «вызов метода на макете»

Я тестирую службу Spring и хочу создать фиктивный сеанс, чтобы мне не приходилось подключаться к реальной базе данных.

К несчастью:

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'.

TweetServiceTest.java

Session session;
TweetService tweetService = new TweetServiceImpl();

@Before
public void setUp() throws Exception {
    session = Mockito.mock(Session.class);
    HibernateUtil hibernateUtil = Mockito.mock(HibernateUtil.class);
    Mockito.when(hibernateUtil.getSession()).thenReturn(session);
}

HibernateUtil.java

public static Session getSession() {
    Session session = null;
    try {
        session = HibernateUtil.getSessionFactory().getCurrentSession();
        if (!session.isOpen()) {
            session = HibernateUtil.getSessionFactory().openSession();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return session;
}

person abc32112    schedule 12.08.2014    source источник


Ответы (1)


Mockito не издевается над статическими методами. Только методы экземпляра.

Имитация статических методов потребовала бы переопределения самого класса.

Методы имитирующего экземпляра должны только создать экземпляр динамически сгенерированного подкласса, который переопределяет все методы суперклассов.

Сделайте свой метод методом экземпляра (желательно) или используйте PwerMockito, который, AFAIK, позволяет имитировать статические методы (но более сложный и медленный)

person JB Nizet    schedule 12.08.2014
comment
Ах, понятно, это все объясняет. - person abc32112; 12.08.2014