2015-06-25 12 views
33

Кажется, что mockito проверяет, вызван ли метод макетного объекта, а у mock-объекта всегда есть sth. например, doReturn(). когда (макет объекта) ...Как проверить метод немонического объекта?

Но могу ли я создать макет объекта и определить doReturn(). когда (mock object) .. , а затем проверить метод другого объекта?

Вот что я хочу сделать: я определяю mockEnvironment и возвращаю ответ независимо от того, что произойдет. Но тогда я хочу проверить разные методы anotherObj вызывается в разных случаях.

Как это сделать?

public class BaseClass { 
    private Environment mockEnvironment; 
    @Test 
    public void testcase() { 
    setMockitoEnvironment(); 
    response = foo(mockEnvironment, argument1); 
    verify(anotherObj).codePath1(...); 
    response = foo(mockEnvironment, argument2); 
    verify(anotherObj).codePath2(...); 
    } 
} 

//this method successfully return a response with any input 
//because I do not care how response is eventually generated, 
//I only care whether code path reaches createResponse() via 
//code path 1 or code path 2. 
private void setMockitoEnvironment() { 
    mockEnvironment = mock(Environment.class); 
    doReturn (response).when(mockEnvironment).createResponse(for any input); 
} 
private Response foo(...) { 
    ... 
    return createResponse(...); 
} 

ответ

47

Вы можете использовать Mockito Spy для этого. Если вы устанавливаете anotherObj в качестве шпиона, вы можете проверить вызовы методов на этом объекте. В вашем примере вам нужно убедиться, что вызов foo использует шпион вместо обычной реализации anotherObj. Шпион устанавливает что-то вроде этого:

AnotherClass anotherObjSpy = Mockito.spy(new AnotherClass()); 
// do stuff 
verify(anotherObjSpy).codePath1(...); 
+0

Это значит, что мне нужно будет создать и ввести несколько обманутых объектов, если я хочу проверить несколько вещей? это не удобно. – user389955

+0

@ user389955 Да, вам нужно настроить каждый объект, который вы хотите проверить как шпион. Насколько я знаю, это не так. Mockito должен добавить прокси-сервер к объектам, и кто-то должен сказать Mockito, который указывает на прокси-сервер. –

+1

Вместо того, чтобы говорить «// делать что-то», может быть полезно добавить, что это «anotherObjSpy», который должен заставить тестировать метод. – jwehrle