Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 莫基托不是';无法模拟基元类型_Spring_Unit Testing_Mockito - Fatal编程技术网

Spring 莫基托不是';无法模拟基元类型

Spring 莫基托不是';无法模拟基元类型,spring,unit-testing,mockito,Spring,Unit Testing,Mockito,我正在为我的一个验证器编写一个单元测试,该验证器使用整数类型作为@Autowired依赖项 现在,在编写测试时,我不能像Spring所说的那样@Mock- org.mockito.exceptions.base.MockitoException: Cannot mock/spy class java.lang.Integer Mockito cannot mock/spy following: - final classes - anonymous classes - primit

我正在为我的一个验证器编写一个单元测试,该验证器使用整数类型作为
@Autowired
依赖项

现在,在编写测试时,我不能像Spring所说的那样
@Mock
-

org.mockito.exceptions.base.MockitoException: 
Cannot mock/spy class java.lang.Integer
Mockito cannot mock/spy following:
  - final classes
  - anonymous classes
  - primitive types
我该如何避开它

我的验证器看起来像这样-

public class MyValidator {

    @Autowired
    @Qualifier(value = "intervalInDays")
    private Integer intervalInDays; // does not get mocked!!

    @Autowired
    private LanguageValidator languageValidator;

    @Autowired
    private IdValidator idValidator;

    public void validate(Request request) {
     //does some validations

    }
}
@RunWith(MockitoJUnitRunner.class)
public class MyValidatorTest {

    @InjectMocks
    private MyValidator myValidator; //isnt mocked at all

    @Mock
    private LanguageValidator languageValidator; //works fine

    @Mock
    private IdValidator idValidator; //works fine

    @Mock(name = "intervalInDays")
    private Integer intervalInDays;

//some tests here
}
此验证器类的测试如下所示-

public class MyValidator {

    @Autowired
    @Qualifier(value = "intervalInDays")
    private Integer intervalInDays; // does not get mocked!!

    @Autowired
    private LanguageValidator languageValidator;

    @Autowired
    private IdValidator idValidator;

    public void validate(Request request) {
     //does some validations

    }
}
@RunWith(MockitoJUnitRunner.class)
public class MyValidatorTest {

    @InjectMocks
    private MyValidator myValidator; //isnt mocked at all

    @Mock
    private LanguageValidator languageValidator; //works fine

    @Mock
    private IdValidator idValidator; //works fine

    @Mock(name = "intervalInDays")
    private Integer intervalInDays;

//some tests here
}

请建议解决方案,因为
intervalInDays
引用上述Mockito原因无法模拟。

为什么不为该属性创建一个setter

此外,您还可以为
MyValidator
创建一个构造函数,并在其中插入自动连接属性。这使得测试更加容易

例如:

public class MyValidator {

@Autowired
public MyValidator(Integer intervalInDays, LanguageValidator languageValidator, IdValidator idValidator) {
//Set your global attributes
}
}

如果只是为了测试,我必须提供一个设置器,为什么我要使用自动布线?我给出了两种设置依赖项的方法。首先,您可以使setter-only包可见。其次,它将使您的代码更易于测试。实际上,我从来没有使用过
@InjectMocks
,因为我写的代码是这样的,我可以注入我的属性。第三,您仍然可以使用构造函数。此外,在这里您可以看到许多关于如何注入mock的方法。如果这是唯一的解决方案,请检查这一点,因为它与spring处理其他依赖项的方式不一致。