java 参数不同!测试创建方法JUnit 5时,为什么?

ycl3bljg  于 2022-12-10  发布在  Java
关注(0)|答案(1)|浏览(155)

目前,我正在为我的个人项目编写单元测试。不幸的是,我遇到了一个特定的逻辑,我不知道如何测试。
我有一个create方法,它将DTOMap到实体,并使用存储库保存它。

public AruCall create(AruCallDtoRequest dtoRequest) {
    log.info("creating aru call with dto: {}", dtoRequest);
    AruCall aruCall = AruCall.builder()
            .aruRequestsId(dtoRequest.getAruRequestsId())
            .customerMsisdn(dtoRequest.getCustomerMsisdn())
            .callParam(dtoRequest.getCallParam())
            .dopFlag(dtoRequest.getDopFlag())
            .waitCalls(dtoRequest.getWaitCalls())
            .build();
    log.info("built aru call with dto: {}", dtoRequest);
    return aruCallsRepository.save(aruCall);
}

在测试中,我试图验证repository.save()方法调用,但不幸的是,测试返回了“Argument(s)are different!”异常。下面是我的TestClass:

@ExtendWith(MockitoExtension.class)
class AruCallServiceImplTest {

    @InjectMocks
    private AruCallsServiceImpl aruCallsService;

    @Mock
    private AruCallsRepository aruCallsRepository;

    @Test
    @DisplayName("Test for creating and saving new AruCall")
    public void test_createdObjectsFieldsAreEqualToDtoFields() {
        aruCallsService.create(AruCallDtoRequest.builder()
                .customerMsisdn("test")
                .callParam("test")
                .aruRequestsId(1L)
                .dopFlag(1)
                .waitCalls(0)
                .build());
        verify(aruCallsRepository).save(AruCall.builder()
                .aruRequestsId(1L)
                .customerMsisdn("test")
                .callParam("test")
                .dopFlag(1)
                .waitCalls(0)
                .build());
    }
}

有任何建议如何修复或优化此测试吗?

ctrmrzij

ctrmrzij1#

它不起作用,因为验证时的AruCall对象与服务内创建的对象不是同一个对象。
要验证对象是否包含正确的值,u应该使用参数捕获器:

var dto = AruCallDtoRequest.builder()
            .customerMsisdn("test")
            .callParam("test")
            .aruRequestsId(1L)
            .dopFlag(1)
            .waitCalls(0)
            .build());

aruCallsService.create(dto);

final ArgumentCaptor<AruCall> captor = ArgumentCaptor.forClass(AruCall.class);
verify(aruCallsRepository).save(captor.capture());

final AruCall savedAruCall = captor.getValue();

assertThat(savedAruCall.getWaitCalls()).isEqualTo(dto.getWaitCalls())
// further assertions

相关问题