带有嵌套Java和Xml Spring配置的JUnit

时间:2017-07-10 08:24:26

标签: java spring spring-mvc junit

我正在尝试在我的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")来读取测试配置。

2 个答案:

答案 0 :(得分:2)

你不能像Spring documention中提到的那样自动装配String:

  

您无法自动装配所谓的简单属性,例如基元,字符串和类(以及此类简单属性的数组)。这种限制是按设计的。

我建议在application.properties文件中定义一个属性,以便您能够将这类信息外部化。

您应该查看this以获取更多信息。

答案 1 :(得分:0)

我认为问题可能是您的applicationContext.xml在测试类路径中不可见。您需要将其移动到test / resources以使其正常工作。

但正如@Rlarroque在他的回答中提到的,你真的应该考虑一个用于配置数据库名称的属性解决方案。首先,它可以让您重新配置数据库名称,而无需重建整个应用程序。