【问题标题】:How to Unit Test A Method Argument which is a Builder Class in Mockito?如何对作为 Mockito 中的构建器类的方法参数进行单元测试?
【发布时间】:2019-11-29 19:48:55
【问题描述】:

我在 Spring Boot 中有一个从我的班级调用的依赖项。此依赖项使用新实例化的构建器模式类作为参数进行调用。我需要知道在进行依赖调用时是否可以验证这个单个构建器类是否是用某些值构造的,例如:

public class MyClass {

  @Autowired
  private MyDep myDep;

  public void callMyDepService() {
    myDep.serviceCall(new MyBuilder().paramOne("One").paramTwo("Two").build());
  }

}

如您所见,每次都会实例化一个新的 MyBuilder,所以我不能只使用 Mockito 的 eq() 来匹配参数的值。

【问题讨论】:

  • MyBuilder 构建什么类?您可以使用它并为any() 定义它(或者只使用任何而不定义类),如果您想验证您的参数,请使用Captor 或使用thenAnswer / doAnswer 来拦截参数。跨度>
  • 此外,您应该对 MyBuilder 类进行单独的测试,以验证它是否正确构建。如果您的 myDep.serviceCall 需要某些属性,则该类本身应对此进行验证,这又将是一个单独的测试。
  • @second 我想确保callMyDepService 使用某些参数值调用myDep.serviceCall。它们是硬编码的,其中有几个 callMyDepService 方法具有类似的依赖服务调用。我不关心构建器类,因为它有自己的单元测试。

标签: java spring spring-boot junit mockito


【解决方案1】:

我想确保 callMyDepService 使用某些参数值调用 myDep.serviceCall。

使用俘虏似乎是最简单的方法。 像这样,SomeClass 是您的 MyBuilder 构建的类。

@ExtendWith(MockitoExtension.class)
public class CaptureTest {

    @InjectMocks
    MyClass classUnderTest;

    @Mock
    MyDep myDep;

    @Test
    public void test() {

        classUnderTest.callMyDepService();

        Captor<SomeClass> captor = ArgumentCaptor.forClass(SomeClass.class);
        Mockito.verify(myDep).serviceCall(captor.capture());

        SomeClass parameter = captor.getValue();
        // do assertions
    }
}

【讨论】:

  • 谢谢。实际上,我出去阅读Captor 并让它工作。似乎@Captor 是一种更可取的方法。
  • 我会说这取决于您是否在不同的测试中重复使用 Captor。如果您有多个测试并且每个人都使用不同的捕获器,那么将它们全部定义在顶部的可读性较差(因为您需要弄清楚哪个测试正在使用什么)。但那是基于我的看法。
  • 是的,在你描述的场景中,你是对的。然而,正如我所提到的,我的测试最终将使用相同的构建器类调用此依赖服务,因此声明一个 ArgumentCaptor 并在每个测试中重用它是有意义的。
  • 如果我将 MyBuilder.Build() 作为参数传递怎么办?在这种情况下如何配置捕获器?我试过 Mockito.verify(myDep).serviceCall(captor.capture().build());但显然它会返回 null。
猜你喜欢
  • 1970-01-01
  • 2017-06-10
  • 2015-08-20
  • 1970-01-01
  • 2012-06-28
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多