gpt4 book ai didi

java - Spring Boot 中的完整验证测试,注入(inject)失败

转载 作者:行者123 更新时间:2023-11-30 10:20:30 25 4
gpt4 key购买 nike

大家好,我想在我的 Spring Boot 应用程序中测试请求的完整验证我的意思是一次不测试一个 validator ,而是在目标对象上测试所有 validator )

首先我有我的对象:

public class UserCreationRequest {
@JsonProperty("profileId")
@NotNull
@ValidProfile
private Integer profileId;
}

然后我的 validator (@ValidProfile):

@Component
public class ProfileValidator implements ConstraintValidator<ValidProfile, Integer> {

@Autowired
private IProfileService profileService;

@Autowired
private IUserRestService userRestService;

@Override
public void initialize(ValidProfile constraintAnnotation) {

}

@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
if (value == null) {
return true;
}

RestUser restUser = userRestService.getRestUser();
ProfileEntity profileEntity = profileService.getProfile(value, restUser.getAccountId());

return profileEntity != null;
}
}

现在我写我的单元测试:

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {ValidationTestConfiguration.class})
public class UserCreationRequestValidationTest {

private static LocalValidatorFactoryBean localValidatorFactory;

@Autowired
private IUserService userService;

@Autowired
private IProfileService profileService;

@Autowired
private IUserRestService restService;

@BeforeClass
public static void createValidator() {
localValidatorFactory = new LocalValidatorFactoryBean();
localValidatorFactory.setProviderClass(HibernateValidator.class);
localValidatorFactory.afterPropertiesSet();
}

@AfterClass
public static void close() {
localValidatorFactory.close();
}

@Test
public void validateUserCreationRequestStringfields() {

UserCreationRequest userCreationRequest = new UserCreationRequest();
/* Here fill test object*/

when(userService.getUser(any(Integer.class), any(Integer.class))).thenReturn(new UserEntity());
when(profileService.getProfile(any(Integer.class), any(Integer.class))).thenReturn(new ProfileEntity());
when(restService.getRestUser()).thenReturn(new RestUser());

Set<ConstraintViolation<UserCreationRequest>> violations
= localValidatorFactory.validate(userCreationRequest);

assertEquals(violations.size(), 8);
}
}

我的 TestConfiguration 是这样的:

@Configuration
public class ValidationTestConfiguration {

@Bean
@Primary
public IProfileService profileService() {
return Mockito.mock(IProfileService.class);
}

@Bean
@Primary
public IUserRestService userRestService() { return Mockito.mock(IUserRestService.class); }
}

在执行时,我可以看到在测试本身中注入(inject)有效:restService 映射到“Mock for IUserRestService”

但是在我的 validator 中它没有被注入(inject),userRestService 是空的。

ProfileService 也是一样

我尝试了这里看到的几件事,没有任何效果(代码正在运行,只有测试配置失败)

最佳答案

这是因为您没有生成 Validator bean,所以它可以被注入(inject)。

当您手动实例化 LocalValidatorFactoryBean 时,它无法访问为此测试定义的 spring DI。

您应该为 validator 生成一个 bean,或者甚至引用现有的 spring 配置来执行此操作。

关于java - Spring Boot 中的完整验证测试,注入(inject)失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48188579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com