[英]Spring @Value annotation not working with mockito mock
我正在使用spring @Value
注释并为A
类中A
某些字段设置值。
我正在为这个A
级写单元测试。 在测试课程中,我使用Mockito @Spy
注释A
类的参考。 我将值设置为系统属性,然后调用MockitoAnnotations.initMocks(this).
我的期望是,间谍对象将通过@Value
注释使用系统属性中的值初始化字段。 但这不会发生。
请有人解释一下吗?
我有一个类似的测试,我使用以下相关代码:
@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
Mockito 不是 Spring意识到的! 永远不会! 你总是必须自己初始化这种注射,因为它不是纯粹的java。
不过你可以看一下springockito ,它是一个弹簧延伸,可以实现Mockito与Spring的一些有趣用法。 但是你必须为测试创建一个Spring上下文。
请注意,在JUnit测试中使用spring上下文就像制作集成测试一样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.