Spring @Value注释不适用于mockito mock

时间:2014-02-23 08:18:36

标签: java spring unit-testing mockito spring-annotations

我正在使用spring @Value注释并为类A中的某些字段设置值。

我正在为这个班级A编写单元测试。在测试类中,我使用Mockito A注释类@Spy的引用。我将值设置为系统属性,然后调用MockitoAnnotations.initMocks(this).

我的期望是,间谍对象将通过@Value注释使用系统属性中的值初始化字段。但这种情况并没有发生。

请有人解释一下吗?

2 个答案:

答案 0 :(得分:3)

我有类似的测试,我使用以下相关代码:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="/context.xml")
public class ContextTest {

    private boolean started = false;

    @Spy
    @Autowired
    private Baz baz;

    @Before
    public void before() {
        if (!started) {
            MockitoAnnotations.initMocks(this);
            started = true;
        }
    }

    @Test
    public void spy() {
        Assert.assertEquals("value", baz.getProperty());
        Mockito.verify(baz).getProperty();
    }

}

基本上它会让spring处理测试注释(由于SpringJUnitRunner),然后让Mockito处理它们(显式调用MockitoAnnotations.initMocks(instanceOfTestClass))。


要完成测试的其他文件

简单Baz.java春课:

package foo.bar;

import org.springframework.beans.factory.annotation.Value;

public class Baz {

    @Value("${property:test}")
    private String property;

    public String getProperty() {
        return property;
    }

    public void setProperty(String property) {
        this.property = property;
    }

}

context.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
                           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location">
            <value>my.properties</value>
        </property>
    </bean>

    <bean id="baz" class="foo.bar.Baz" />

</beans>

my.property档案:

property=value

和maven(pom.xml)文件:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>spring-test</groupId>
    <artifactId>my.spring.test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>3.2.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>3.2.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>3.2.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-all</artifactId>
            <version>1.9.5</version>
                    <scope>test</scope>
        </dependency>
    </dependencies>
</project>

文件结构是:

+ spring-test
  - pom.xml
  + src/main/java
      + foo.bar
         - Baz.java
  + src/main/resources
      - context.xml
      - my.properties
  + src/test/java
      + foo.bar
         - ContextTest.java

答案 1 :(得分:3)

Mockito 不是 Spring意识到了!永远不会!你总是必须自己初始化这种注射,因为它不是纯粹的java。

但是你可以看一下springockito,它是一个弹簧扩展,可以使用Spring有趣地使用Mockito。但是你必须为测试创建一个Spring上下文。

请注意,在JUnit测试中使用spring上下文就像制作集成测试一样。