如何模拟配置类进行测试

问题描述 投票:0回答:1

我正面临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;

}

我该如何处理? (我相信我在初始化时遇到问题)

java testing junit mockito spring-test
1个回答
0
投票

如果你使用注解@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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.