Spring4+Junit4单元测试及bug解决

来源:互联网 发布:广东外语外贸大学知乎 编辑:程序博客网 时间:2024/06/06 17:51

博主的配置文件都是放在src/main/resources/里面,这也是bug出现的主要原因。不过也有朋友将配置文件放在WEB-INF下,以个人情况处理。

先放一段我之前的代码:

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = { "classpath*:/spring.xml", "classpath*:/spring-mybatis.xml" })public class MyBatisTestBySpringTestFramework {@Autowiredprivate UserService userService;@Testpublic void testAddUser() {User user = new User();user.setAge("1111");user.setName("wangwu");System.err.println(user.toString());userService.insert(user);}}
代码表面上看一点问题没有,但是却报错。然后查阅了classpath的介绍:

  classpath 路径在每个J2ee项目中都会用到,即WEB-INF下面的classes目录,所有src目录下面的java、xml、properties等文件编译后都会在此,
所以在开发时常将相应的xml配置文件放于src或其子目录下;
       引用classpath路径下的文件,只需在文件名前加classpath:(需保证该文件确实位于classpath路径下);

classpath* 的使用:当项目中有多个classpath路径,并同时加载多个classpath路径下(此种情况多数不会遇到)的文件,*就发挥了作用,如果不加*,
则表示仅仅加载第一个classpath路径

上面代码逻辑内容方面没什么问题,也不用找配置文件本身或者其他代码的问题,主要就在这classpath这,运行的时候可能会报not found错误,也可能不报,但是像博主这样讲配置文件放在resources里面的话,这样加载配置文件是错误的,就算没有报not found 的异常,其实本身也是没有加载的,会出现各种莫名其妙的异常。比如:userService not defined、can not create bean 、userMapper not found、等等。

如果你也遇到同样的问题,就按照下面的代码修改;

将locations里面的配置文件路径改为file:取值。反正是线下的测试代码,是不需要往线上部署的,所以去掉花哨的东西,怎么实用怎么方便怎么来。

@ContextConfiguration(locations = { "file:src/main/resources/spring_*.xml" })

然后你以为就这样结束了,然而并不是bug你是你想改完,想改就能改。为了高度贴合线上代码,所以配置文件也会尽量原封不动的搬过来。这里有个问题,线上代码是装配在tomcat服务器下的,spring可以轻易的找到classpath下的配置文件,但是单独加载spring容器的话就找不到。主要原因我还没有找到,目前的折中的办法是将配置文件中涉及的classpath文件换成file指定的绝对路径。


@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
  @Resource装配顺序
  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
  2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
  3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
  4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配; 

0 0