论坛首页 编程语言技术论坛

在使用StrtusSpringTestCase时调用getActionProxy时抛nullpointer的原因

浏览 2712 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-01-12   最后修改:2013-01-12
最近没事想玩一下Struts2的单元测试,然后查了下一般可以用StrutsSpringTestCase来做,这个类继承自StrutsTestCase。在网上搜了下简单的例子。

因为struts测试库是模拟出request等web环境,所以不需要跑在tomcat里,可以直接run junit。模拟action的第一步就是调用getActionProxy()方法。如:
ActionProxy proxy = getActionProxy("/login.action");


然后一跑就给我报错。
Unable to instantiate Action, personAction,  defined for 'login' in namespace '/'personAction
.
.
.
.
Caused by: java.lang.ClassNotFoundException: personAction
.
.
.	


这个错一般都是由于spring配置错误或位置存放错误导致了没有帮UserAction创建之类的。然后反复检查了applicationContext.xml, web.xml甚至是struts.xml,没发现什么问题。最重要的是项目在tomcat里运行完全正常。总觉得配置文件应该不会有问题。于是就纳闷了,开始满世界的网上搜。但是结果不理想。无论是国内还是国外的资料似乎都不能帮我解决问题。难得在国外的论坛上找到和我一样问题的人,结果没有解决方案。国内的搜索,事后回想其实还是有正确解答的。只不过感觉没说清楚。

于是没办法,只能开始debug源码,希望能有点进展。最后通过调试struts spring源码终于找到问题所在了。 当我绕了一大圈debug到StrutsSpringTestCase类里,看到第一行写了:
static final String DEFAULT_CONTEXT_LOCATION ="classpath*:applicationContext.xml" 

一瞬间蛋都碎了……

classpath*:applicationContext.xml

spring默认读取/WEB-INF下的app...xml,居然TestCase默认读取classpath下…… 而我的app...xml放在了默认的/WEB-INF/下。那当然创建不了自己定义的bean了。此时我试了一下,将app...xml搬到了类路径下,果然就成功了。

本来这样就想算了,后来想想,能不能把StrutsSpringTestCase配置成读取我自定义的路径。

 protected void setupBeforeInitDispatcher() throws Exception {
        // only load beans from spring once
        if (applicationContext == null) {
            GenericXmlContextLoader xmlContextLoader = new GenericXmlContextLoader();
            applicationContext = xmlContextLoader.loadContext(getContextLocations());
        }

        ........
}
protected String[] getContextLocations() {
        return new String[] {DEFAULT_CONTEXT_LOCATION};
    }


这里加载上下文的方法loadContext直接读取了那个默认的静态变量DEFAULT_CONTEXT_LOCATION,也就是"classpath*:applicationContext.xml"。而loadContext方法的实现不断深入,关于路径变量locations都是一些其他的判断和字符上的改变,没有我预想中的如果判断为空,再怎么怎么。换句话说,loadContext方法处已经将最终的路径给定死了。而且似乎没有去读web.xml中的内容(这毕竟不是真的web容器),所以我即使在web.xml中配置了路径也没有生效。


其实最后两点我还是对自己有点怀疑。觉得这struts测试lib也不能hardcode成这样,默认是好事。。也得可配,至少读一下web.xml吧
   发表时间:2013-01-12  
你是用maven组织的项目吗,难道测试跟正式环境用一套配置文件?
0 请登录后投票
   发表时间:2013-01-13  
liubey 写道
你是用maven组织的项目吗,难道测试跟正式环境用一套配置文件?


啊,我是自己玩的,主要是还不熟悉啦,我一般的思路是,这种测试的工具作为一个插件一类的嵌入这个系统,理应做到对大框架的默认兼容,这样比较优雅。而且这些配置文件也不是什么性能方面的东西,都是和业务逻辑有关的。用不用一套不是原则问题吧。
0 请登录后投票
   发表时间:2013-01-13  
liubey 写道
你是用maven组织的项目吗,难道测试跟正式环境用一套配置文件?


啊,对了,我是试着用maven来管理的。用maven有什么要注意的地方么?
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics