Java 在新对象中初始化mock
我的类无法自动连接UserService-它抛出NullPointerException。我想找到一种测试UserValidator类的方法。我不知道如何在现有的ValidationRule类中注入mockJava 在新对象中初始化mock,java,spring,unit-testing,mockito,Java,Spring,Unit Testing,Mockito,我的类无法自动连接UserService-它抛出NullPointerException。我想找到一种测试UserValidator类的方法。我不知道如何在现有的ValidationRule类中注入mock public class ExistingValidationRule implements RegistrationRule<User> { @Autowired private UserService service; @Override public void valid
public class ExistingValidationRule implements RegistrationRule<User> {
@Autowired
private UserService service;
@Override
public void validate(User user, Errors errors) {
service.find(user, errors);
}
}
@Component
public class UserValidator implements Validator {
@Override
public void validate(Object o, Errors errors) {
User user = (User) o;
rules.add(new ExistingValidationRule());
for(RegistrationRule<User> rule : rules){
rule.validate(user, errors);
}
}
}
public class UserValidatorTest {
@InjectMocks
private UserValidator userValidator;
@InjectMocks
private ExistingValidationRule existingValidationRule;
@Mock
private UserService service;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testValidUser() throws Exception{
userValidator.validate(createdUser,errors);
}
公共类ExistingValidationRule实现注册规则{
@自动连线
私人用户服务;
@凌驾
公共无效验证(用户、用户错误){
服务。查找(用户、错误);
}
}
@组成部分
公共类UserValidator实现验证器{
@凌驾
公共无效验证(对象o、错误){
用户=(用户)o;
添加(新的现有ValidationRule());
for(注册规则:规则){
规则。验证(用户、错误);
}
}
}
公共类用户验证测试{
@注射模拟
私有用户验证程序;
@注射模拟
私有ExistingValidationRule ExistingValidationRule;
@嘲弄
私人用户服务;
@以前
公共作废设置(){
initMocks(this);
}
@试验
public void testValidUser()引发异常{
验证(createdUser,错误);
}
类用户验证程序
//如果您需要的所有角色都是Springbeans,那么请执行autowired,然后按超级类型执行
@自动连线
私人收藏角色;
@凌驾
公共无效验证(对象o、错误){
用户=(用户)o;
//所有Springbean配置的验证器都是自动连接的
对于(注册规则:规则){
规则。验证(用户、错误);
}
}
或
@组件
公共类UserValidator实现验证器{
//如果以前创建过规则
@自动连线
public void setExistingValidationRule(ExistingValidationRule ExistingValidationRule){
添加(existingValidationRule);
}
@凌驾
公共无效验证(对象o、错误){
用户=(用户)o;
for(注册规则:规则){
规则。验证(用户、错误);
}
}
并尽量避免在方法validate()中添加新的责任-就像添加新的验证器一样。方法validate应该只做验证,没有什么比Spring注释更重要的了,除非您使用Spring测试运行程序运行单元测试,否则这将什么都做不了 但是,Mockito的
@InjectMocks
只会用mock填充您的字段,只要您提供了访问这些字段的构造函数。请尝试以下操作:
public class ExistingValidationRule implements RegistrationRule<User> {
@Autowired
private UserService service;
public ExistingValidationRule(UserService service) {
this.service = service;
}
public ExistingValidationRule() {
}
@Override
public void validate(User user, Errors errors) {
service.find(user, errors);
}
}
公共类ExistingValidationRule实现注册规则{
@自动连线
私人用户服务;
公共ExistingValidationRule(用户服务){
服务=服务;
}
public ExistingValidationRule(){
}
@凌驾
公共无效验证(用户、用户错误){
服务。查找(用户、错误);
}
}
我添加了第二个空构造函数来让Spring开心。第一个应该可以为您的单元测试提供技巧
愉快的测试!如果您使用
new
创建SpringBean实例,它们不再是SpringBean实例,因此无法由Spring自动连接,因为Spring无法知道该实例是否存在。将现有的ValidationRule实例自动连接到UserValidator。当您的大多数问题被否决时,您正在做一些事情兴致让很多人恼火。也许缺少家庭作业是答案。
@Component
public class UserValidator implements Validator {
//if rules was created before
@Autowired
public void setExistingValidationRule(ExistingValidationRule existingValidationRule){
rules.add(existingValidationRule);
}
@Override
public void validate(Object o, Errors errors) {
User user = (User) o;
for(RegistrationRule<User> rule : rules){
rule.validate(user, errors);
}
}
public class ExistingValidationRule implements RegistrationRule<User> {
@Autowired
private UserService service;
public ExistingValidationRule(UserService service) {
this.service = service;
}
public ExistingValidationRule() {
}
@Override
public void validate(User user, Errors errors) {
service.find(user, errors);
}
}