我正在尝试在我的Spring MVC应用程序中引入JUnit,我正在使用java和xml配置的混合(我的java配置使用xml来自动修改一些变量)来定义我的bean:
// 1 - 我的测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MvcConfiguration_Test.class)
@WebAppConfiguration
public class ClassTest {
@Autowired
@Qualifier("databaseTest")
DataBaseConn conn;
@Test
public void test() {
// do some stuff
}
}
// 2 - Java配置
@EnableWebMvc
@Configuration
@ImportResource({ "applicationContext.xml" }) // this file is in classpath, actually I'm using "classpath:**/applicationContext.xml" but the next step is to move this file in resources/test :)
public class MvcConfiguration_Test extends MvcConf{
@Autowired
String dbName; // defined in applicationContext.xml
@Bean
public DataBaseConn databaseTest(){
DataBaseConn conn = new DataBaseConn();
conn.addDataSource(dbName, jndi, user, pwd)
return conn;
}
}
// 3 - xml配置 - applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans ...
<context:annotation-config />
<bean id="dbName" class="java.lang.String">
<constructor-arg value="myDb"/>
</bean>
</beans>
当我启动JUnit测试时,出现以下错误:
java.lang.IllegalStateException: Failed to load ApplicationContext
...
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mvcConfiguration_Test': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: java.lang.String package.MvcConfiguration_Test.dbName; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [java.lang.String] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency.
解决方法是以脏方式连接db的名称: String dbName =“myDb”; 但这不是理想的解决方案:))
PS。我的MVC应用程序自动装配值correclty(我只从MvcConfiguration中删除@ComponentScan("ct.cbi")
来读取测试配置。
答案 0 :(得分:2)
你不能像Spring documention中提到的那样自动装配String:
您无法自动装配所谓的简单属性,例如基元,字符串和类(以及此类简单属性的数组)。这种限制是按设计的。
我建议在application.properties文件中定义一个属性,以便您能够将这类信息外部化。
您应该查看this以获取更多信息。
答案 1 :(得分:0)
我认为问题可能是您的applicationContext.xml在测试类路径中不可见。您需要将其移动到test / resources以使其正常工作。
但正如@Rlarroque在他的回答中提到的,你真的应该考虑一个用于配置数据库名称的属性解决方案。首先,它可以让您重新配置数据库名称,而无需重建整个应用程序。