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

ca1c2owp  于 2023-10-14  发布在  Java
关注(0)|答案(1)|浏览(215)

我有一些使用Mockito的集成测试,它们工作得很好。
但是,我想验证在我测试的过程中某个时候调用的方法的输入。问题是我不想模拟方法的行为,只想检查它的参数并执行真实的方法。如果我这样做:

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

我得到一个错误,因为没有找到ClassThatIsCalled的依赖项。即使我做了given(classThatIsCalled.callMethod(any())).willCallRealMethod();,我仍然在嘲笑ClassThatIsCalled,这不是我想做的。
有没有一种方法可以调用ClassThatIsCalled的生产性代码(不模仿它),并简单地检查传递的参数?
TL;DR:我想使用@Spy/@Captor/similar来检查传递给类的参数,但不模拟类,而是调用它的真实的方法(使用.willCallRealMethod()是不够的,因为模拟的类没有注入依赖项)。

soat7uwm

soat7uwm1#

你可以使用@SpyBean
可用于将Mockito spies应用于Spring ApplicationContext的注解。可以用作类级别的注解,也可以用于@Configuration类或@RunWith SpringRunner测试类中的字段。
间谍可以按类型或bean名称应用。匹配类型(包括子类)上下文中的所有bean都将被spy Package 。如果没有定义现有的bean,将添加一个新的bean。将找不到应用程序上下文已知但不是bean(例如直接注册的那些)的依赖项,并且将spied bean添加到现有依赖项的上下文中。

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

  // ...
}

相关问题