如何使用 Mockito 捕获参数并执行真正的方法?

问题描述 投票:0回答:1

我有一些使用 Mockito 的集成测试,它们运行良好。

但是,我想验证在我正在测试的过程中某个时间调用的方法的输入。 问题是:我不想模拟方法行为,只想检查其参数并执行真正的方法。 如果我做这样的事情:

@MockBean
private ClassThatIsCalled classThatIsCalled;
@Captor
private ArgumentCaptor<TypeOfMyParameter> typeOfMyParameter;

我收到错误,因为找不到

ClassThatIsCalled
的依赖项。即使我这样做
given(classThatIsCalled.callMethod(any())).willCallRealMethod();
我还在嘲笑
ClassThatIsCalled
这不是我想做的。

有没有办法调用

ClassThatIsCalled
的生产代码(不嘲笑它)并简单地检查传递的参数?

TL;DR:我想使用

@Spy
/
@Captor
/类似来检查传递给类的参数,但不模拟该类,而是调用其真正的方法(使用
.willCallRealMethod()
是不够的,因为模拟类没有注入依赖项)。

java mockito spy
1个回答
0
投票

您应该能够使用

@SpyBean
:

可用于将 Mockito 间谍应用到 Spring

ApplicationContext
的注释。可以用作类级别注释,也可以用于
@Configuration
类中的字段,或
@RunWith
SpringRunner 的测试类。

Spies 可以按类型或 bean 名称来应用。匹配类型(包括子类)上下文中的所有 bean 都将用间谍包装。如果没有定义现有的 bean,则会添加一个新的 bean。应用程序上下文已知但不是 bean 的依赖项(例如直接注册的依赖项)将不会被发现,并且监视 bean 将与现有依赖项一起添加到上下文中。

@ExtendWith(SpringExtension.class)
class YourTest {
  @SpyBean
  private ClassThatIsCalled classThatIsCalled;
  @Captor
  private ArgumentCaptor<TypeOfMyParameter> typeOfMyParameter;

  // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.