это передовое объявление класса. По моему опыту, это обычно делается, когда у вас есть круговая зависимость .. например
in foo.h
--------
#include "bar.h"
class foo
{
public:
foo(bar *bar);
private:
foo *m_foo;
};
and in bar.h
------------
class foo;
class bar
{
public:
void methodFooWillCall();
protected:
std::list<foo *> myFoos;
}
Решение так называемой проблемы заключается в использовании шпиона
Mockito.spy (...) вместо mock
Mockito.mock (..) .
Шпион позволяет нам частично издеваться. Mockito хорош в этом вопросе. Поскольку у вас есть неполный класс, таким образом вы высмеиваете какое-то необходимое место в этом классе.
Это может быть сделано 2 способами в зависимости от сценариев как:
doAnswer - Если мы хотим, чтобы наш дразнивший пустой метод сделал что-то (дразнят поведение несмотря на то, чтобы быть пустым).
doThrow - у Нас также есть Mockito.doThrow (), если Вы хотите выдать исключение из дразнившего пустого метода.
Посмотрите документацию по API Mockito . Как упоминается в связанном документе (пункт № 12), вы можете использовать любой из doThrow ()
, doAnswer ()
, doNothing ()
, doReturn ()
семейство методов из фреймворка Mockito для имитации методов void.
Например,
Mockito.doThrow(new Exception()).when(instance).methodName();
или, если вы хотите объединить это с последующим поведением,
Mockito.doThrow(new Exception()).doNothing().when(instance).methodName();
Предполагая, что вы собираетесь имитировать сеттер setState (String s)
в классе World ниже код использует метод doAnswer
для имитации setState
.
World mockWorld = mock(World.class);
doAnswer(new Answer<Void>() {
public Void answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
System.out.println("called with arguments: " + Arrays.toString(args));
return null;
}
}).when(mockWorld).setState(anyString());