如何获取实体内的嵌套对象

mbskvtky  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(150)

我是新的单元测试。我正在尝试测试服务层在一个Spring的应用程序。好,我有任何关系在我的服务。

VirtualDatacenterModel vdc = vdcRepository.findById(vmDTO.getVdc()).orElseThrow(() -> new ClientException("Invalid VDC id"));
    DataCenterModel dc = vdc.getDatacenter();
    String vmName = vdc.getTenant().getName() + "_[" + vmDTO.getName() + "]";

在我的测试中,我使用了MOCKITO,依赖关系已经被模仿了,然后我就看不出哪里错了

CreateVmDTO vmDTO = Mockito.mock(CreateVmDTO.class);
    VmModel vm = Mockito.mock(VmModel.class);
    VirtualDatacenterModel vdc = Mockito.mock(VirtualDatacenterModel.class, Mockito.RETURNS_DEEP_STUBS);
    TenantModel tenant = Mockito.mock(TenantModel.class);
    Mockito.when(vmRepository.save(vm)).thenReturn(new VmModel());
    Mockito.when(vdcRepository.findById(vmDTO.getVdc())).thenReturn(Optional.of(new VirtualDatacenterModel()));
    Mockito.doReturn(tenant).when(vdc).getTenant();
    Mockito.when(vdc.getTenant().getName()).thenReturn("Olivia");

    VmModel vmReturn = vmService.createVM(vmDTO);

我收到了NullPointerException,我可能不知道如何正确使用Mockito

hkmswyz6

hkmswyz61#

你当时只能嘲弄一个动作,下面这一行肯定会出问题:

Mockito.when(vdcRepository.findById(vmDTO.getVdc())).thenReturn(Optional.of(new VirtualDatacenterModel()));

导致vmDTO.getVdc()将返回空指针。(vmDTO本身是一个模拟对象,没有用于该调用的指令集)。假设vmDTO.getVdc()返回vdc,您可以按如下方式修复:

CreateVmDTO vmDTO = Mockito.mock(CreateVmDTO.class);
    VmModel vm = Mockito.mock(VmModel.class);
    VirtualDatacenterModel vdc = Mockito.mock(VirtualDatacenterModel.class, Mockito.RETURNS_DEEP_STUBS);

//example fix:
    Mockito.when(vmDTO.getVdc()).thenReturn(vdc);

    TenantModel tenant = Mockito.mock(TenantModel.class);
    Mockito.when(vmRepository.save(vm)).thenReturn(new VmModel());

//also you can do directly:
    Mockito.when(vdcRepository.findById(vdc)).thenReturn(Optional.of(new VirtualDatacenterModel()));

    Mockito.doReturn(tenant).when(vdc).getTenant();
    Mockito.when(vdc.getTenant().getName()).thenReturn("Olivia");

    VmModel vmReturn = vmService.createVM(vmDTO);

另外,您的方法的命名也让我感到困惑:你有一个方法vdcRepository.findById,但是你的输入是一个vdc对象,而不是一个id。要么是命名混乱,要么是你的输入错误。如果getVdc返回了一个Id,那么你可以通过模拟Id的返回来修复代码(将方法重命名为getVdcId或其他名称)。
注意:我个人很少模仿DTO。创建真实的的DTO对象也很容易,因为它们通常带有一个构建器或getter/setter。

相关问题