重温SSH小项目实践(3)-Spring2.5Test测试

 

Spring2.5Test测试

上一篇介绍了把ibatis搞到项目中来,现在是时候验证一下代码是否正确的时候了,我们在小项目里采用的是Spring2.5自带的测试框架,为什么?因为他提供了一系列测试的扩展,如测试类只要继承一下AbstractTransactionalJUnit38SpringContextTests类,spring框架的启动和管理都交给测试框架去管理,这个基类还提供了事务管理的功能,在测试中可以对莫个用例进行控制,执行完毕后数据库又回滚到测试执行的状态,从而达到即完成了测试,又保证测试数据即使清理的问题,来看一下我们的执行

1)测试类的存放和命名

  目前所有的测试类统一放置在src/test/java中,测试目前处于业务逻辑层,因为业务逻辑层会调用dao层,所以不对dao层做单独测试,测试类的包结构层次和java源文件保持严格一致,如com.taobao.top.coreapp.service.user.impl.UserInfoServiceImpl类的测试代码为com.taobao.top.coreapp.service.user.impl.UserInfoServiceImplTest,测试方法采用test+方法名的方式,如testGetUserInfoById(),对要进行事物控制的测试用例用spring的@Transactional标注注解,这样spring测试框架在执行时会在测试用例开始时开启事物,而在测试用例结束时把当前事物回滚

2)拉出我们Service层的接口方法run一把,验证一下我们前两篇里的配置是否正确--这里我们还没有把dbunit拉如进来,以下的例子还只是验证框架的集成是否Ok

@Transactional

public void testCreateUserInfo() {

UserInfo userInfo = new UserInfo();

userInfo.setName("zhangsan");

userInfo.setPassword("111111");

userInfo.setNick("张三");

try {

userInfoService.createUserInfo(userInfo);

logger.info(userInfo);

Assert.assertTrue(userInfo.getId() > 0);

} catch (CoreAppBizException e) {

Assert.fail("创建用户测试用例失败");

}

}

跑了一把,失败了,后台报错

java.lang.NoSuchMethodError: org/springframework/core/annotation/AnnotationUtils.findAnnotationDeclaringClass(Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/Class;

at org.springframework.test.context.TestContext.retrieveContextLocations(TestContext.java:143) 

at org.springframework.test.context.TestContext.<init>(TestContext.java:108) 

at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:103) 

at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTestContextManager(SpringJUnit4ClassRunner.java:102) 

at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:79) 

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 

at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:67) 

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 

at java.lang.reflect.Constructor.newInstance(Constructor.java:521) 

at org.junit.internal.requests.ClassRequest.buildRunner(ClassRequest.java:33) 

at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:28) 

at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:26) 

at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:24) 

at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:34) 

at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:24) 

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:445) 

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) 

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) 

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) 

找不到方法,这个是为什么呢,这个问题迷惑了我很久,后来找到原因了

大家知道spring的测试框架是spring2.5里的内容,所以当时我把spring里的依赖版本从2.0改成了2.5.4,spring的测试框架版本也是2.5.4,为什么还找不到呢?

通过maven的dependency 视图我搜索了一下spring,结果惊奇的发现还有spring-core2.0,spring-beans2.0这样的依赖,这些依赖从哪里来的?原来是maven自动生成的那个个框架中使用的是spring2.0的版本,虽然我们手动的把spring的版本该改成2.5了,但是这些jar包里的依赖还在,怎么办呢?在pom文件里把这些依赖排除一下就行了

<dependency>

<groupId>org.apache.struts</groupId>

<artifactId>struts2-spring-plugin</artifactId>

<version>2.0.11.2</version>

<exclusions>

<exclusion>

<groupId>org.springframework</groupId>

<artifactId>spring-beans</artifactId>

</exclusion>

<exclusion>

<groupId>org.springframework</groupId>

<artifactId>spring-core</artifactId>

</exclusion>

<exclusion>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

</exclusion>

<exclusion>

<groupId>org.springframework</groupId>

<artifactId>spring-web</artifactId>

</exclusion>

<exclusion>

<groupId>org.springframework</groupId>

<artifactId>spring-mock</artifactId>

</exclusion>

</exclusions>

</dependency>

果然,排除后问题解决了,单元测试也跑起来了,框架没问题了,兴奋的去数据库去查一下数据,结果又悲剧了,中文乱码了,呵呵,这个也纠结过一阵子,以下是分析过程

a)先前都是在windows下编程,windows下的mysql目录中有个my.ini文件,改一下里面的编码集就行了,Ubuntu上的在哪里呢

  google,baidu,都用上了,原来linux系统下是在 /etc/mysql/my.cnf,呵呵,换了个马甲我一样能找到你~

b)修改一下编码集

  要改动3处地方,分别找到[client],[mysqld],[mysqldump]在这三个元素的下面分别加一句话default-character-set=utf8保存退出,重启一下mysql服务就ok了,可怜的中文终于存放进去了,遇到类似问题的时候多数是这些个参数没设置导致的,可以用命令行登录系统,通过输入status看一下编码集合是否都改动成utf-8了(默认是litin1),如图,设置后的编码都是UTF8

总结:

  maven是个双刃剑,一方面会带来很大的便利性,一部到位,你不用去了解太多的东西,但是这也是他的问题所在,特别是对于间接依赖,不了解他的整个流程,很难去解决问题,问题出来的时候多看看报错信息,尝试从报错信息中找出一些答案,然后验证自己的想法,然后google,乱码的问题也是很经常的问题,对于这种编码经验就是统一编码,从数据库到jsp,到程序源码,jsp,vm,ftl,邮件所有都utf8一般都是不会出问题的,utf8一统天下,呵呵

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值