如何在Spring中模拟ModelMapper?

2024-05-04

我正在尝试为我的服务层编写单元测试:

@SpringBootTest
class ClinicServiceTest {

@Mock
private ProcedureRepository procedureRepository;
@InjectMocks
private ClinicService clinicService;

@Test
void setProcedureStatus() {
    when(procedureRepository.findById(1L)).thenReturn(Optional.of(initialEntity));
    when(procedureRepository.saveAndFlush(expectedEntity)).thenReturn(expectedEntity);
    Procedure assertProcedure = clinicService.setProcedureStatus(1L, "CANCELED");
  }
}

当我打电话时setProcedureStatus方法它抛出 NullPointerException 因为我的服务类使用由 Spring 自动装配的 ModelMapper:

@Service
@RequiredArgsConstructor
public class ClinicService {

private final ProcedureRepository procedureRepository;
private final ModelMapper modelMapper;

public Procedure setProcedureStatus(Long procedureId, String status) {
    ...
    return modelMapper.map(procedureEntity, Procedure.class);
}

}

单元测试不会引发 Spring 上下文,这就是当我从测试中调用 ModelMapper 时,Service 中的 ModelMapper 为 null 的原因。有办法解决这个问题吗?


您想编写一个单元测试,以便您不应该提出春天的背景。单元测试比集成测试更快(您通常希望提高 spring 上下文)。当谈到你想要测试的单元测试时unit您的申请的一部分。

在这种情况下,您将收到 NPE,因为您没有初始化 ModelMapper。

我没有看到您在哪里创建 ClinicService,但有一个示例可以帮助您避免 NPE:

@Test
void setProcedureStatus() {
    when(procedureRepository.findById(1L)).thenReturn(Optional.of(initialEntity));
    when(procedureRepository.saveAndFlush(expectedEntity)).thenReturn(expectedEntity);
    // Initialize ClinicService with mocked procedeRepository but real ModelMapper
    ClinicService clinicService = new ClinicService(procedureRepository, new ModelMapper(), ... other dependencies );
    Procedure assertProcedure = clinicService.setProcedureStatus(1L, "CANCELED");
}

或者你也可以模拟 ModelMapper。

另一种方法是使用 MockitoJunitRunner 并在测试下初始化您的类,如下所示:

@RunWith(MockitoJUnitRunner.class)
 public class ExampleTest {
 
     @Mock
     private ModelMapper modelMapper;

     @Mock
     private Repository repository;

     @InjectMocks
     private ClinicService classUnderTest;
  

由于依赖项注入,您的代码测试起来要简单得多,因为您只需使用通过构造函数传递的依赖项来创建服务。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Spring中模拟ModelMapper? 的相关文章

随机推荐