如何使用 Mockito 在 mock 上显示所有调用

2022-09-01 03:46:06

我有一个单元测试失败了,我不确定为什么。我希望能够看到模拟上在被测系统中发生的所有调用。这不是我想要的所有测试总是的行为,只是为了一个测试,我需要快速调整才能找出问题所在。

但是,这似乎有点像黑客攻击。是否可以在 Mockito 中本机执行此操作,而不必使用 Thread.currentThread().getStackTrace()

这不是首选,因为堆栈跟踪包括 Mockito 内部使用的所有其他调用。


答案 1

此功能自Mockito 1.9.5起就内置了。只需使用

mock(ClassToMock.class, withSettings().verboseLogging())

答案 2

从 Mockito 2.2.6 中,您可以使用 MockingDetails Mockito.mockingDetails(Object mockToInspect) 检查模拟

您可以通过调用 : , , 等来深入研究属性...或者直接使用返回的方法:MockingDetailsgetMock()getStubbings()getInvocations()printInvocations()

模拟对象发生的调用的打印友好列表。此外,此方法还打印存根信息,包括未使用的存根。有关未使用的存根检测的详细信息,请参阅 MockitoHint。

例如,对于 JUnit 5:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.junit.jupiter.MockitoExtension;
import org.mockito.Mock;
import org.mockito.Mockito;
import static org.mockito.Mockito.*;

@ExtendWith(MockitoExtension.class)
public class FooTest {

    Foo foo;

    @Mock
    Bar bar;

    @Test
    void doThat() throws Exception {
        
        Mockito.when(bar.getValue())
               .thenReturn(1000L);          

        // ACTION
        foo.doThat();

        // ASSERTION
        // ...

        // add that to debug the bar mock           
        System.out.println(mockingDetails(bar).printInvocations());
    }
}

你会得到一个输出,例如:

[Mockito] Interactions of: Mock for Bar, hashCode: 962287291
 1. bar.getValue();
  -> at Foo.doThat() (Foo.java:15) 
   - stubbed -> at FooTest.doThat(FooTest.java:18)

请注意,输出中带有引用行的类是指向源代码/测试类的链接。非常实用。