我有一些使用 Mockito 的集成测试,它们运行良好。
但是,我想验证在我正在测试的过程中某个时间调用的方法的输入。 问题是:我不想模拟方法行为,只想检查其参数并执行真正的方法。 如果我做这样的事情:
@MockBean
private ClassThatIsCalled classThatIsCalled;
@Captor
private ArgumentCaptor<TypeOfMyParameter> typeOfMyParameter;
我收到错误,因为找不到
ClassThatIsCalled
的依赖项。即使我这样做given(classThatIsCalled.callMethod(any())).willCallRealMethod();
我还在嘲笑ClassThatIsCalled
这不是我想做的。
有没有办法调用
ClassThatIsCalled
的生产代码(不嘲笑它)并简单地检查传递的参数?
TL;DR:我想使用
@Spy
/@Captor
/类似来检查传递给类的参数,但不模拟该类,而是调用其真正的方法(使用 .willCallRealMethod()
是不够的,因为模拟类没有注入依赖项)。
@SpyBean
:
可用于将 Mockito 间谍应用到 Spring
的注释。可以用作类级别注释,也可以用于ApplicationContext
类中的字段,或@Configuration
SpringRunner 的测试类。@RunWith
Spies 可以按类型或 bean 名称来应用。匹配类型(包括子类)上下文中的所有 bean 都将用间谍包装。如果没有定义现有的 bean,则会添加一个新的 bean。应用程序上下文已知但不是 bean 的依赖项(例如直接注册的依赖项)将不会被发现,并且监视 bean 将与现有依赖项一起添加到上下文中。
@ExtendWith(SpringExtension.class)
class YourTest {
@SpyBean
private ClassThatIsCalled classThatIsCalled;
@Captor
private ArgumentCaptor<TypeOfMyParameter> typeOfMyParameter;
// ...
}