java - 使用 @InjectMocks 注入(inject) String 属性

标签 java spring unit-testing dependency-injection mockito

我有一个带有这个构造函数的 Spring MVC @Controller:

@Autowired
public AbcController(XyzService xyzService, @Value("${my.property}") String myProperty) {/*...*/}

我想为此 Controller 编写一个独立的单元测试:

@RunWith(MockitoJUnitRunner.class)
public class AbcControllerTest {

    @Mock
    private XyzService mockXyzService;

    private String myProperty = "my property value";

    @InjectMocks
    private AbcController controllerUnderTest;

    /* tests */
}

有没有办法让 @InjectMocks 注入(inject)我的 String 属性?我知道我不能模拟一个字符串,因为它是不可变的,但是我可以在这里注入(inject)一个普通的字符串吗?

@InjectMocks 在这种情况下默认注入(inject)一个空值。如果我将它放在 myProperty 上,@Mock 会引发异常,这是可以理解的。是否有另一个我错过的注释只是意味着“注入(inject)这个确切的对象而不是它的模拟”?

最佳答案

使用 Mockito 无法做到这一点,但 Apache Commons 实际上有一种方法可以使用其内置实用程序之一来做到这一点。您可以将它放在 JUnit 中的一个函数中,该函数在 Mockito 注入(inject)其余模拟之后但在您的测试用例运行之前运行,如下所示:

@InjectMocks
MyClass myClass;

@Before
public void before() throws Exception {
    FieldUtils.writeField(myClass, "fieldName", fieldValue, true);
}

关于java - 使用 @InjectMocks 注入(inject) String 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36084559/

相关文章:

java - 遍历文件夹时 DirectoryStream 和 File.list() 的性能差异

spring - 由于 facebook 范围,无法使 spring-social-showcase-boot 工作?

java - spring-security.xml 中的密码更改

java - Eclipse junit View 中的不可打印字符

java - 覆盖率与可达代码

java - 私有(private) Void Tick();不工作

抛出 RuntimeException 时,Java 期望返回值

java - 获取LWGL中的当前法线

spring - 如何在 Grails 中不断检查上传大小?

angularjs - promise 没有在 Jasmine 中解决 - AngularJS