首页 > 解决方案 > 如何使用 mockito 捕获在服务方法中实例化的 DTO

问题描述

我有服务 A

@Service
class ServiceA {

    @Override
    public void foo(MyDto dto){};
}

和服务 B 作为

@Service
class ServiceB{

    @Override
    public void bar(){
        final MyDto myDto = new MyDto();
        serviceA.foo(myDto);
        if(myDto.check()){
            // block to test further
        }
    }
}

我尝试按照以下方式测试服务 B 栏方法

@Mock
private ServiceA serviceA
@InjectMocks
private ServiceB unit;

@Test
public void test(){
    ArgumentCaptor<MyDto> captor = ArgumentCaptor.forClass(MyDto.class);
    when(serviceA.foo(captor.capture()));
    MyDto dto = captor.getValue();
    dto.setCheck(true);
    unit.bar();
}

服务 b 中的“如果”进入 else,因为它是错误的,如何在服务 A 方法调用中传递存根 dto,我不能使用参数捕获器,因为在方法调用之前无法捕获值。除了改变服务方法之外的任何解决方案?

标签: javaspring-bootjunitmockingmockito

解决方案


您可以使用 power Mockito 来实现这一点。将以下内容添加到您的测试类中。

@RunWith(PowerMockRunner.class)
@PrepareForTest({ServiceB.class})

测试实现如下。

MyDto myDto = Mockito.spy(MyDto.class);
myDto.setCheck(true);

PowerMockito.whenNew(MyDto.class).withNoArguments().thenReturn(myDto);
unit.bar();

在这里,我们创建了一个 myDto 的 spy 对象,并使用 powerMockito.whenNew 来传递这个对象。


推荐阅读