Посмотрев на код ниже, я ожидаю, что вызов getSand()
произойдет один раз, но тест не работает с четырьмя вызовами на него. Где происходят эти звонки? Я хочу написать тест, чтобы убедиться, что только один вызов сделан в getSand()
.Mockito: Проверить Mock (с помощью «RETURNS_DEEP_STUBS») Возвращает больше вызовов, чем ожидалось
Источник
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class DeepSandTest {
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
SandBox mockSandBox;
@Test
public void should(){
when(mockSandBox.getSand().doA()).thenReturn(1);
when(mockSandBox.getSand().doB()).thenReturn(1);
when(mockSandBox.getSand().doC()).thenReturn(1);
DeepSand deepSand = new DeepSand(mockSandBox);
deepSand.getTipple();
verify(mockSandBox, times(1)).getSand();
}
public class DeepSand{
private SandBox sandBox;
public DeepSand(SandBox sandBox) {
this.sandBox = sandBox;
}
public void getTipple(){
Sand sand = sandBox.getSand();
sand.doA();
sand.doB();
sand.doC();
}
}
public interface SandBox{
public Sand getSand();
}
public interface Sand{
public Integer doA();
public Integer doB();
public Integer doC();
}
}
Выход
org.mockito.exceptions.verification.TooManyActualInvocations:
mockSandBox.getSand();
Wanted 1 time:
-> at DeepSandTest.should(DeepSandTest.java:26)
But was 4 times. Undesired invocation:
-> at DeepSandTest.should(DeepSandTest.java:20)
Детали Java 1.6, JUnit 4,11, Mockito 1.9.5
уроки
Если вы думаете о глубоких заглушках как о древе макетных объектов, то вы должны только проверять листья («последний макет в цепочке»), потому что узлы включены в цепочку вызовов, необходимую для настройки поведения листьев , Чтобы выразить это другим способом, узлы - это, называемые во время настройки листьев.
Это странно, любая идея, почему она рассчитывает настройку? –
Я думаю, что из-за того, что многие другие уже говорят, API проверки не поддерживает глубокие заглушки, поэтому он не может отличаться от реального вызова и пропущенного вызова: http://docs.mockito.googlecode.com/hg/org/ mockito/Mockito.html # RETURNS_DEEP_STUBS – crunchdog
Ну, это отстой ..... – nterry