给我这孱弱的博客添一篇文章吧……
=========================================================================
最近没事想玩一下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吧
分享到:
相关推荐
其他开发工具调用都没问题,pb调用就提示参数为null,经过多方努力比较,此方法确实可行。
编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时, 在系统中有一个父进程和两个子进程活动。 让每一个进程在屏幕上显示一个字符:父进程显示“A”; 子进程分别显示字符“b”和“c”。试观察记录...
我们上层应用平台是使用java开发的,但开放平台是使用c++开发,虽提供给我们对应的.h头文件,但在java中来解析这些数据就显然有些复杂,在实现、效率上都可能不太理想。 解决方案: 请C++同事帮忙写个dll程序,dll去...
使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上的中断信号(即按DEL键);当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: ...
使用C++结合QT调用bartender打印条码的教程,包含源码和详细文档,文档里还有配置内容,只要工具齐全,运行起来没问题。除了是bartender的调用方法,还可以当做基础的QT的学习,配置到创建工程一应俱全。本想免费...
但是在调用JAVA的WebService时并没有这么简单,特别是对于SoapHeader的处理,通过C#添加Web引用方式访问JavaWebService的方法,除了string类型能正常传递参数外,q其他类型的参数不是默认值就是NULL,究其原因的C#...
在子窗口中调用父窗口的成员函数的方法 1、用FindWindow("类名(可以是派生类)","窗口标题")或GetParent(),二者均能返回父窗口句柄,并能直接使用其成员函数。但是此法只能调用CWnd类里的成员函数,而不能调用自己...
Winform中使用CefSharp和js互相调用方法,Winform中使用CefSharp和js互相调用方法,Winform中使用CefSharp和js互相调用方法,Winform中使用CefSharp和js互相调用方法 vs2019.debug目录下有cef所需要的文件,在其他...
案例文档里面有使用教程——《基于MFC与第三方类CWebPage的百度地图API开发范例.pdf》,可依照教程步骤进行操作。源码在“GeoDemo”文件夹里面。
C#使用CLR调用C++的DLL库的windows完整解决方案 说明如下: 1、工程一:C++的DLL 2、工程二:C++的CLR的类库 3、工程三:C#的exe
我们知道,使用 JNI 调用 .dll/.so 共享类库是非常非常麻烦和痛苦...使用 JNA ,不需要再编写适配用的 .dll/.so ,只需要在 Java 中编写一个接口和一些代码,作为 .dll/.so 的代理,就可以在 Java 程序中调用 dll/so 。
亲测可用,java 成功调用dll函数。包含调用回调函数,springboot版本。最近由于公司业务需要,要调用dll文件,用JNA调用。
1,chrome 浏览器本身不支持直接调用exe,但可以使用url protocol handler 调用exe 2,直接双击exe_chrome.reg 安装注册表 3,test.html 要在运行在容器里(tomcat,resin XXXX),本地直接打开是执行不了的,我...
T2F函数,在matlab中做傅里叶变换时调用,时间域信号转化为频率域
c#通过Twain 直接调用扫描仪功能,vs版本2008以上可用,基本功能俱全
编制一段程序,实现进程的管道通信,使用系统调用pipe()建立一个管道文件;两个子进程P1和P2 分别向管道各写一句话: Child1 is sending a message! Child2 is sending a message! 而父进程则从管道中读出来自于...
本例子是一个C#类库,可以发布为DLL文件给其他项目调用;...使用完毕后需调用:dm.close();释放大漠对象,否则资源会占用过多 注意: 需要.net FrameWork4.5环境 开发工具为:visual studio 2013
我们在使用spring cloud时如果设置了oauth2授权模式,那么应用服务A再调用服务B时使用Feign请求会出现401授权认证的问题,那么解决办法就是在feign调用请求时获取到assessToken并设置到请求header中就可以解决这个...
C#中在一个窗体里调用另一个窗体的方法;C#不同窗体方法调用
C#使用OpenCV调用摄像头预览以及拍照(源码)代码是本人为了测试高拍仪调用所写