您的位置:首页 > 编程语言 > Java开发

his测试 junit原来不能用的问题解决方法 及 eclipse开发加速小技巧 (from victor)

2012-11-23 08:40 627 查看
大家都知道,eclipse, 有时候速度慢的要死,让我们很抓狂,卡 是它的一个特性! 这也严重影响了我们的开发速度,有时候为了测试一个改进,不得一次、两次、三次…… N次的编译、发布、重启tomcat, 而每次少则一两分钟,多则几分钟, 这中间花费的时间可想而知。

1 先说elipse 优化

插件: 用得时间长了,就会装很多插件,启动关闭eclipse都很慢。  解决方法:preference, 搜Window->Preferences->General-Startup and Shutdown (打勾或去勾) 可以禁掉不用的插件

编译:改用手动编译,千万不用自动编译了,自动编译经常到73% 是个死穴。  

 解决方法: 工具栏project, 去掉build automatically。   手动编译快捷键:ctrl+B (相对来说,那是相当滴快啊)

另外,如果不怎么改页面html xhtml, 页面校验validation也可以去掉,编译时校验也很费时,preference,搜validatoion, 把相应的勾勾去掉

2 发布 tomcat

 tomcat关闭重启也是经常的事,怎么能更省点事呢?  server 窗口,双击 打开页面


图1


 图2

通过 图1 可以配置工程与tomcat的结合方式;  图2 配置发布方式,选3 可以每次编译(ctrl+b)就 自动发布(选2可以每次改动资源文件就自动发布)。 如果你仅修改了一些非已注入的bean代码,连重启tomcat也免了,否则也需要重启, 但至少把发布这步也给省了。

3  我们的工程下经常会有各种工程,有自己的开发工程,可能还有自己的测试工程,暂时没用的可以close掉,这样在启动 关闭 编译(ctrl+b)时都可以快点



4 最后是解决his下 junit不能用的问题。  之前大家都用过的,后来不能用了。

原来的问题一运行出现的问题是:



这里面给的提示 全是junit spring框架的错误代码,没有一点关于我们的业务代码,确实不太好找到问题所在。

经过一些分析,不是lib包的问题,也不是test代码本身的问题, 最终的原因是mapper加载出现了问题,即:



准确来说是:加载 com.centling.his.persistence.dictionary的问题,再准确一点是加载com.centling.his.persistence.dictionary.base 和 com.centling.his.persistence.dictionary.patient 包 的问题

但我挨个试了下,单独加载里面的每个类,又没问题。  里边代码我不熟,不好说。

解决方案:我们重写一个配置文件testContext.xml ,在测试类时读入。

针对要测试哪个业务方法,只加载需要的mapper和service bean, 没有必要全部加载,虽然需要在配置文件多写几行代码,但在启动时那是快不少滴 ~~~~~ 

给出两种配置方案:

(-)比如只需要两个service 和几个mapper, 可以这么写

<bean class="com.centling.his.service.BusinessService.ChargeService"> 
</bean>
<bean class="com.centling.his.service.hospitalcharge.PatientChargeInventoryInHospitalService"> 
</bean>

<!-- 只加载需要的mapper类 -->

  <bean id="chargeMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
   <property name="mapperInterface" value="com.centling.his.persistence.Business.ChargeMapper" />
   <property name="sqlSessionFactory" ref="sqlSessionFactory" />
  </bean>
  <bean id="inpBillDetailMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
   <property name="mapperInterface" value="com.centling.his.persistence.finance.inHospital.InpBillDetailMapper" />
   <property name="sqlSessionFactory" ref="sqlSessionFactory" />
  </bean>
  <bean id="dictFunctionInfoMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
   <property name="mapperInterface" value="com.centling.his.persistence.dictionary.sys.DictFunctionInfoMapper" />
   <property name="sqlSessionFactory" ref="sqlSessionFactory" />
  </bean>
    <bean id="patientInhospRecordMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
   <property name="mapperInterface" value="com.centling.his.persistence.medical.patient.PatientInhospRecordMapper" />
   <property name="sqlSessionFactory" ref="sqlSessionFactory" />
  </bean>
    <bean id="dictSectionInfoMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
   <property name="mapperInterface" value="com.centling.his.persistence.dictionary.staff.DictSectionInfoMapper" />
   <property name="sqlSessionFactory" ref="sqlSessionFactory" />
  </bean>
    <bean id="patientAdmissionRecordMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
   <property name="mapperInterface" value="com.centling.his.persistence.medical.patient.PatientAdmissionRecordMapper" />
   <property name="sqlSessionFactory" ref="sqlSessionFactory" />
  </bean> 

(二)第二种解决方式  配置代码少点,加载的多点

<!-- 需要的用到或测试的 service -->
<bean class="com.centling.his.service.BusinessService.ChargeService"> 
</bean>
<bean class="com.centling.his.service.hospitalcharge.PatientChargeInventoryInHospitalService"> 
</bean>

<!--只加载需要的包,看清楚里边没有com.centling.his.persistence.dictionary.base 和 com.centling.his.persistence.dictionary.patient 包 噢 -->

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.centling.his.persistence.Business;
com.centling.his.persistence.finance;
com.centling.his.persistence.medical;
com.centling.his.persistence.dictionary.sys;
com.centling.his.persistence.dictionary.staff;
com.centling.his.persistence.dictionary.patient;
" />
</bean>

另外,希望大家在平常 测试base 和 patient包下的mapper 的过程中,能够逐步找到是哪个mapper的问题,真正解决之~~~~

示例代码已经上传: 配置文件是textContext.xml, 测试类是 根目录test下 com.centling.his.mobile.PatientChargeTest

可以完美运行。

以后,让我们像以前一样尽情的“junit” 吧!!!

希望对大家的开发和测试有一些帮助,提高我们的开发测试速度。。。。。

Best Wises For EveryBody ~~~~~

Hi everyone   不好意思,我之前没理解到家。 谢谢大师的指出,Seven的反馈。谢谢Damon,与他也一起测试了一下————Controller 也是在tomcat启动读入xml时 一并加载了的,如下:





既然如此,在之前说的“比较理想与省时间的开发和测试步骤”中 把Controller代码和页面放在tomcat上启动测试,就行不通了。但

是我们可以做如下调整: 即 Controller的代码也可以像service一样在junit测试上测试好,就可以了。  然后只“启动一

次”tomcat来测试 xhtml页面, 不也是一样的吗?!   当然只“启动一次”只是理想情况,如果你junit测试好了,确实可以尽量减

少Tomcat启动次数,提高开发效率。

另外,在用junit测试的时候,我们经常用打印的方式,但是我感觉有时候用debug更方便,设一个返回的变量,通过Debug我们可以直

接看到里边的值,很方便,比写一串打印语句要方便。

不重启的终极方案:

1  Dynamic code evolution VM   一个允许在运行状态下无限制的修改加载类文件的Java虚拟机补丁 
http://ssw.jku.at/dcevm/binaries/  

但是我没安装成功,也就没测试成功,我的jdk是1.7,好像说不支持。  1.6的童鞋 感兴趣的可以试一下,期待你们有重大发现!!!

2. Jrebel   一个eclipse的插件
http://zeroturnaround.com/jrebel/jrebel-4-5-released-includes-jrebel-social/
我已经安装测试了,很方便确实无须重启,图下:



修改了controller的代码,编译过后,直接有效果!!!

限制:它是收费的。   机会:可以有两周的免费试用;另外可以给Scala项目和非商业开源项目免费使用一年  ~~~~~~

喜欢尝鲜的brothers and sisters 可以试一下

Good luck!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  谢谢victor
相关文章推荐