首页 > 解决方案 > [JUnit][Mockito] 如何验证方法在调用堆栈的另一层被调用?

问题描述

我有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()从测试中检测到实例?

标签: javaunit-testingjunitmockito

解决方案


你只需要使用间谍

@Spy
private OtherClass otherClass;

但是,这不是一个好习惯。您正在测试两个不同的类。我只想确保您bar在第一次测试中使用正确的参数进行调用。然后为OtherClass.


推荐阅读