[JUnit] [Mockito] Как проверить, был ли вызван метод другого уровня вниз по стеку вызовов? - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть MyClass, в котором в качестве поля указано OtherClass:

public class MyClass
{
    @Autowired
    private OtherClass other;
    public void foo() {
        // Some interactions
        other.bar(someParameter);
    }
}

public class OtherClass
{
    public void bar() {
        // Some interactions
        if (someConditionThatIsTrue) {
            baz(someParam);
        }
    }

    public void baz(SomeParamClass param) {
        // Some interactions
    }
}

Для тестирования MyClass я хочу проверить, что OtherClass.baz() был вызван с MyClass.foo(). Вот что у меня есть:

@RunWith(MockitoJUnitRunner.class)
public class MyClassTest {
    @InjectMocks
    private MyClass myClass;
    @Mock
    private OtherClass otherClass;

    @Test
    public void testFoo_whenFooIsCalled_shouldTriggerBaz() {
        // Some setups
        myClass.foo();
        verify(otherClass, times(1)).baz(any());
    }
}

Приведенный выше тест не обнаруживает OtherClass.baz(), но обнаруживает OtherClass.bar():

Wanted but not invoked: otherClass.baz( <any> ); -> at MyClassTest.testFoo_whenFooIsCalled_shouldTriggerBaz(MyClassTest.java:12) However, there were other interactions with this mock: otherClass.bar( "some parameter" ); -> at MyClass.foo(MyClass.java:7)

Без рефакторинга MyClass, возможно ли обнаружить экземпляр OtherClass.baz() из теста?

1 Ответ

1 голос
/ 16 апреля 2019

Вам просто нужно использовать шпиона

@Spy
private OtherClass otherClass;

Однако это не очень хорошая практика.Вы тестируете два разных класса.Я бы просто позаботился о том, чтобы вы набрали bar в вашем первом тесте с правильным параметром.Затем создайте отдельный файл модульного теста для OtherClass.

...