StrutsSpringTestCase中使用convention报Couldn't get resource paths for class path resource的解决方案

在使用StrutsSpringTestCase【单元测试版本为struts2-junit-plugin-2.1.8.jar】进行action的单元测试过程中如果你使用了struts的零配置convention插件就会出现以下问题,虽然对整个单元测试不构成什么影响,但是每次都抛出恼人的异常【后文给出解决方案

2013-06-26 09:35:22,112 3948 [main] WARN  o.s.mock.web.MockServletContext - Couldn't get resource paths for class path resource [WEB-INF/content/] 

java.io.FileNotFoundException: class path resource [WEB-INF/content/] cannot be resolved to URL because it does not exist
at org.springframework.core.io.ClassPathResource.getURL(ClassPathResource.java:179) ~[spring-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:48) ~[spring-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.mock.web.MockServletContext.getResourcePaths(MockServletContext.java:238) ~[spring-test-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.apache.struts2.convention.DefaultResultMapBuilder.createFromResources(DefaultResultMapBuilder.java:254) [struts2-convention-plugin-2.3.4.jar:2.3.4]
at org.apache.struts2.convention.DefaultResultMapBuilder.build(DefaultResultMapBuilder.java:191) [struts2-convention-plugin-2.3.4.jar:2.3.4]
at org.apache.struts2.convention.PackageBasedActionConfigBuilder.createActionConfig(PackageBasedActionConfigBuilder.java:891) [struts2-convention-plugin-2.3.4.jar:2.3.4]
at org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildConfiguration(PackageBasedActionConfigBuilder.java:674) [struts2-convention-plugin-2.3.4.jar:2.3.4]
at org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildActionConfigs(PackageBasedActionConfigBuilder.java:345) [struts2-convention-plugin-2.3.4.jar:2.3.4]
at org.apache.struts2.convention.ClasspathPackageProvider.loadPackages(ClasspathPackageProvider.java:53) [struts2-convention-plugin-2.3.4.jar:2.3.4]
at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:245) [xwork-core-2.3.4.jar:2.3.4]
at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:66) [xwork-core-2.3.4.jar:2.3.4]
at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:390) [struts2-core-2.3.4.jar:2.3.4]
at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:437) [struts2-core-2.3.4.jar:2.3.4]
at org.apache.struts2.util.StrutsTestCaseHelper.initDispatcher(StrutsTestCaseHelper.java:54) [struts2-core-2.3.4.jar:2.3.4]
at org.apache.struts2.StrutsTestCase.initDispatcher(StrutsTestCase.java:202) [struts2-junit-plugin-2.1.8.jar:na]
at com.eshopmates.finance.junittest.StrutsActionTest.initDispatcher(StrutsActionTest.java:32) [test-classes/:na]
at org.apache.struts2.StrutsTestCase.setUp(StrutsTestCase.java:188) [struts2-junit-plugin-2.1.8.jar:na]
at com.eshopmates.finance.junittest.StrutsActionTest.setUp(StrutsActionTest.java:24) [test-classes/:na]
at junit.framework.TestCase.runBare(TestCase.java:128) [junit-4.1.jar:na]
at junit.framework.TestResult$1.protect(TestResult.java:110) [junit-4.1.jar:na]
at junit.framework.TestResult.runProtected(TestResult.java:128) [junit-4.1.jar:na]
at junit.framework.TestResult.run(TestResult.java:113) [junit-4.1.jar:na]
at junit.framework.TestCase.run(TestCase.java:120) [junit-4.1.jar:na]
at junit.framework.TestSuite.runTest(TestSuite.java:228) [junit-4.1.jar:na]
at junit.framework.TestSuite.run(TestSuite.java:223) [junit-4.1.jar:na]
at org.junit.internal.runners.OldTestClassRunner.run(OldTestClassRunner.java:35) [junit-4.1.jar:na]
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38) [.cp/:na]
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) [.cp/:na]
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) [.cp/:na]
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) [.cp/:na]
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) [.cp/:na]

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) [.cp/:na]


出现上述异常的主要原因在于convention插件解析返回视图路径struts.convention.result.path的值类似于“/WEB-INF/template”,如果用服务器容器启动web项目他会加载URL类型的资源路径,也就是从站点的根目录去找到这个文件,而在我们的单元测试中,该文件路径被视作classPath的类路径文件,从类路径去找当然找不到这个文件了,这个时候为了单元测试的方便,我们可以针对这个问题改写文件的加载路径,从正确的路径去获取视图文件,做法如下:

1、首先我把我的单元测试完整方法贴出来给大家看:

package com.eshopmates.finance.junittest;


import java.util.HashMap;
import java.util.Map;


import org.apache.struts2.StrutsSpringTestCase;
import org.apache.struts2.dispatcher.Dispatcher;
import org.junit.Test;


/**
 * @作者 王建明
 * @创建日期 2013-06-25
 * @创建时间 10:47:04
 * @版本号 V 1.0
 */
public class StrutsActionTest extends StrutsSpringTestCase {
@Override
public String getContextLocations() { // 返回你项目中spring配置文件所在的目录
return "classpath:conf/spring/applicationContext.xml";
}


@Override
protected void setUp() throws Exception {
super.setUp();
}


@Override
protected Dispatcher initDispatcher(Map<String, String> params) {
// TODO Auto-generated method stub
if(params == null)
params = new HashMap<String, String>();
params.put("config", "struts-default.xml,struts-plugin.xml,conf/struts/struts.xml");
params.put("struts.convention.result.path", "/WEB-INF/template");// 当然这里可以需要也可以不要,看你的具体情况
return super.initDispatcher(params);
}


@Override
protected void injectStrutsDependencies(Object object) {
// TODO Auto-generated method stub
super.injectStrutsDependencies(object);
}


@Override
protected void initServletMockObjects() {
// TODO Auto-generated method stub
resourceLoader = new MyResourceLoader();
super.initServletMockObjects();
}


@Test
public void testSynchronizeTaobaoDataAction() throws Exception {
//request.setParameter("userId", "1");
String result = executeAction("/synTaobaoTrade.do");
try {
System.out.println(result);
//Thread.sleep(100000);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

2、其次,要自定义解析文件资源的类MyResourceLoader,用于针对单元测试过程中资源默认只从classPath类路径加载的问题,完整代码如下:

package com.eshopmates.finance.junittest;


import java.net.URL;


import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;


/**
 * @作者 王建明
 * @创建日期 2013-06-26
 * @创建时间 09:22:03
 * @版本号 V 1.0
 */
public class MyResourceLoader extends DefaultResourceLoader {
@Override
public Resource getResource(String location) {

System.out.println("文件路径地址:" + location);

//这里我们对要加载的文件资源进行自定义的解析,我们判断下文件路径是否是以“/WEB-INF/”开头,从而进行处理

if (location != null && location.startsWith("/WEB-INF/")) {
try {
// 由于我的工程是maven工程,所以我的路径重定向到web应用的路径下

URL url = new URL("file:/" + System.getProperty("user.dir")
+ "/src/main/webapp" + location);

return new UrlResource(url);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

return super.getResource(location);
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值