我正面临NPE。
我正在为我的证书课程编写测试,但我遇到了 NPE 错误。这是我的测试课
@ExtendWith(MockitoExtension.class)
public class CredentialServiceTest {
@Mock
private Properties properties;
@Spy
private Mapper mapper = Mockito.spy(new Mapper(properties));
@Test
void testGetCredentials() {
when(credentialRepository.findByCredentialSenderAndInactiveFalse(anyString())).thenReturn(credential);
when(properties.getHost()).thenReturn("http://localhost:8080");
properties.setHost("http://localhost:8080");
mapper = new Mapper(properties);
credentialService.getCredentials(headers);
}
然后我就能够模拟
properties.getHost()
,正如你在测试类中看到的那样。但是,我面临着 NPE,因为在我的映射器中我需要再次使用 properties.getHost()
。我的映射器如下
@Component
@AllArgsConstructor
public class Mapper {
private Properties properties;
public CredentialsDTO mapperCredentialToDTO(Credential credential) {
ModelMapper modelMapper = new ModelMapper();
TypeMap<Credential, CredentialsDTO> propertyMapper = modelMapper.createTypeMap(Credential.class,
CredentialsDTO.class);
CredentialsRoleDTO credentialRoleDTO = mapperCredentialsToCredentialsRoleDTO(credential);
List<CredentialsRoleDTO> credentialsRoleDTO = Arrays.asList(credentialRoleDTO);
propertyMapper.addMappings(mapper -> mapper.map(src -> credentialsRoleDTO, CredentialsDTO::setRoles));
propertyMapper.addMappings(mapper -> mapper.map(src -> credential.getCredentialSender(), CredentialsDTO::setToken));
propertyMapper.addMappings(mapper -> mapper.map(src -> properties.getHost().concat(URLEnum.VERSIONS.getUrl()), CredentialsDTO::setUrl));
return modelMapper.map(credential, CredentialsDTO.class);
}
在
propertyMapper.addMappings(mapper -> mapper.map(src -> properties.getHost().concat(URLEnum.VERSIONS.getUrl()), CredentialsDTO::setUrl));
行中,属性始终为空。
注意:我需要监视我的 Mapper 类。由于其他测试,我无法嘲笑它
最后但并非最不重要的一点是,在这里你可以找到我的 Properties 类
@ConfigurationProperties(prefix = "myapp")
@Component
@ConstructorBinding
@Data
public class Properties {
private String host;
}
我该如何处理? (我相信我在初始化时遇到问题)
如果你使用注解@Mocks,你需要调用
org.mockito.MockitoAnnotations.openMocks(Object object)
。否则你的模拟将为空。
我通常用这样的设置方法来完成它(然后清理它们):
@BeforeEach
public void setupMocks() {
this.closeMocks = openMocks(this);
}
@AfterEach
public void closeMocks() throws Exception {
if (this.closeMocks != null) {
closeMocks.close();
}
}