因为项目组在实行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的开端,以便以后查看。。。。