`

为已有代码添加Unit Test Case所引发的问题和思考

    博客分类:
  • TDD
阅读更多

因为项目组在实行Scrum,想在下一阶段的开发中实行TDD,因为我就为几个已经功能完善的模块添加Unit Test Case。在此过程中,就发现了一些问题。

 

    问题一

在一个模块的一个主要业务方法中,需要从数据库中读取数据。

 

AllocateStream(String key, ServetlContext context)
{
         ..........
       
         ApplicationContext = WebApplicationContextUtils.getWebApplicationContext(context);
	 StreamDao dao = ApplicationContext.getBean("StreamDao");

	 .........
}

 

       在上面的代码中,通过context来,经由Spring来获取Dao对象,此处我认为不需要将Dao对象直接耦合在业务方法中,可以把Dao对象当成方法的参数传递进来或者通过Spring配置文件来关联此Dao对象。以便减少编写测试代码过程中Mock的难度。由于该模块已经在Demo系统,因此不便修改此处代码,所以为了完成该方法的Unit Test,所以我只有通过mock ServletContex和Spring的ApplicationContex来完成该方法的Test。但在Mock Spring的Context过程中,发现了一个更大的问题。

 

     问题二

         在mock Spring的WebApplicationContext过程中,由于需要读取某配置文件,而读取配置文件的代码如下:

 

InitXX()
{
	......
	URL url = this.getClass().getClassLoader().getResource("/conf/xx.xml");  
}

    通过ClassLoader的getResource方法来获取配置文件,是以classpath为起始路径来查找该资源。问题就出在从classpath来查找资源。当该方法应用在demo系统中时,作为一个web项目,WEB-INF目录会作为classpath,因此通过ClassLoader的getResource方法可以定位查找到该资源。

    但是在单独运行Test Case时,在MockSpring的WebApplicationContext的过程中,需要读取该配置文件,但存放该配置文件的路径并未添加到Classpath中,所以根本查找不到该配置文件。

   为了解决这个问题,通过查看API,我给出了下面的解决方法:

    用Class.getResource()方法来替代ClassLoader的getResource方法。调用Class.getResource()时,如果路径是不以"/"开头,则是从当前目录开始查找,如果路径是以"/"开头,则是从classpath开始查找。因此可以用下面的代码来替代上面的代码:

 

InitXX()
{
	......
	URL url = this.getClass().getResource("conf/xx.xml");  
}

 

    记录以上两个发现的问题,作为实行TDD的开端,以便以后查看。。。。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics