Проблема с использованием RETURN_DEEP_STUBS заключается в том, что каждый раз, когда вы вызываете метод, вы получите другой макет. Я думаю, из вашего вопроса, что вы хотите использовать ответ по умолчанию, который фактически возвращает макет, на который он был вызван, для каждого метода, который имеет правильный тип возврата. Это может выглядеть примерно так. Обратите внимание, что я не тестировал это, поэтому он может содержать опечатки, но я надеюсь, что это намерение ясно в любом случае.
import static org.mockito.Mockito.RETURNS_DEFAULTS;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
public class SelfReturningAnswer implements Answer<Object>{
public Object answer(InvocationOnMock invocation) throws Throwable {
Object mock = invocation.getMock();
if(invocation.getMethod().getReturnType().isInstance(mock)){
return mock;
}
else{
return RETURNS_DEFAULTS.answer(invocation);
}
}
}
Затем, когда вы создаете свой макет, укажите это как ответ по умолчанию. Это заставит ваш макет возвращаться от каждого метода, который он может; но он будет вести себя как обычный макет, когда вы вызываете метод, тип возврата которого неверен для макета.
Создайте свой макет, как этот
Builder mockBuilder = mock(Builder.class, new SelfReturningAnswer());
или создать константу для этого класса и написать что-то вроде
@Mock(answer = SELF_RETURNING) private Builder mockBuilder;
Надежда, что помогает.
Вам действительно нужно издеваться над этим? Это не похоже на зависимость, которая стоит насмехаться. Это похоже на «данные» типа класса, а не класса «службы». Я редко нахожу, что полезно создавать классы, где не так много фактического поведения. –
Его просто пример, настоящий строитель немного сложнее, и в этом случае просто не нужно тестировать. –
Можете ли вы разделить их так, чтобы у вас * был «немой строитель» (который не нуждается в насмешке), а затем часть обслуживания, которая * * нуждается в насмешке? –