簡體   English   中英

[JUnit] [Mockito]如何驗證方法在調用堆棧的另一層被調用了?

[英][JUnit][Mockito] How to verify method was called another level down the call stack?

我有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 ,我想檢查是否從MyClass.foo()調用了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()的實例?

您只需要使用間諜

@Spy
private OtherClass otherClass;

但是,這不是一個好習慣。 您正在測試兩個不同的類。 我只想確保您在第一次測試中使用正確的參數調用bar 然后為OtherClass創建一個單獨的單元測試文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM