我正在尝试为我的服务层编写单元测试:
@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(使用前将#替换为@)