第一次写博客,记录下今天学习Spring Test时遇到的问题。
一、问题描述
参照开涛博客在自己的项目上加入Spring Test,其网址为: http://jinnianshilongnian.iteye.com/blog/1469524
下面是我的控制层测试代码:
@RunWith(SpringJUnit4ClassRunner.class) @TestExecutionListeners({}) public class LoginActionTest extends StrutsSpringTestCase { /** * 默认路径 * classpath*:applicationContext.xml * @throws Exception */ @Override protected String[] getContextLocations() { return new String[]{"classpath:applicationContext.xml"}; } @Before public void setUp() throws Exception { //1 指定Struts2配置文件 //该方式等价于通过web.xml中的<init-param>方式指定参数 Map<String, String> dispatcherInitParams = new HashMap<String, String>(); ReflectionTestUtils.setField(this, "dispatcherInitParams", dispatcherInitParams); //1.1 指定Struts配置文件位置 dispatcherInitParams.put("config", "struts-default.xml,struts-plugin.xml,struts.xml"); super.setUp(); } /** * @throws Exception * */ @Test public void testWelcome() throws Exception { String output = executeAction("/user/login!welcome.action"); assertEquals(Action.SUCCESS, output); } @Test public void testDeal() throws Exception { request.setParameter("username", "张三"); request.setParameter("password", "1"); ActionProxy proxy = getActionProxy("/user/login!deal.action"); assertNotNull(proxy); LoginAction action = (LoginAction) proxy.getAction(); assertNotNull(action); String result = proxy.execute(); assertNull(result); // String username = (String) findValueAfterExecute("username"); // String password = (String) findValueAfterExecute("password"); // assertEquals("张三", username); // assertEquals("1", password); System.out.println(response.getContentAsString()); assertEquals("张三", action.getModel().getUsername()); assertEquals("1", action.getModel().getPassword()); } }
下面是JUnit4报错记录:
这是控制台输出的错误:
2016-01-21 15:18:09,848 WARN (org.springframework.mock.web.MockServletContext:319) - Couldn't get resource paths for class path resource [WEB-INF/jsp/user/] java.io.FileNotFoundException: class path resource [WEB-INF/jsp/user/] cannot be resolved to URL because it does not exist at org.springframework.core.io.ClassPathResource.getURL(ClassPathResource.java:187) at org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:48) at org.springframework.mock.web.MockServletContext.getResourcePaths(MockServletContext.java:303) at org.apache.struts2.convention.DefaultResultMapBuilder.createFromResources(DefaultResultMapBuilder.java:252) at org.apache.struts2.convention.DefaultResultMapBuilder.build(DefaultResultMapBuilder.java:189) at org.apache.struts2.convention.PackageBasedActionConfigBuilder.createActionConfig(PackageBasedActionConfigBuilder.java:933) at org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildConfiguration(PackageBasedActionConfigBuilder.java:702) at org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildActionConfigs(PackageBasedActionConfigBuilder.java:348) at org.apache.struts2.convention.ClasspathPackageProvider.loadPackages(ClasspathPackageProvider.java:53) at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:268) at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:67) at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:445) at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:489) at org.apache.struts2.util.StrutsTestCaseHelper.initDispatcher(StrutsTestCaseHelper.java:54) at org.apache.struts2.StrutsTestCase.initDispatcher(StrutsTestCase.java:229) at org.apache.struts2.StrutsTestCase.setUp(StrutsTestCase.java:209) at web.user.LoginActionTest.setUp(LoginActionTest.java:47)
二、解决方法
参照http://blog.csdn.net/jammiwang19870815/article/details/9175607添加自己的ResourceLoader,即可解决,在写的时候注意ResourceLoader路径问题,要与真实路径一致,下面是我的代码:
public class MyResourceLoader extends DefaultResourceLoader { private static final Logger logger = LoggerFactory.getLogger(MyResourceLoader.class); @Override public Resource getResource(String location) { if(location != null && location.startsWith("/WEB-INF/")) { logger.info(location); URL path = null; try { String str = "file:/" + System.getProperty("user.dir") + "/WebRoot" + location; logger.info(str); path = new URL(str); } catch (MalformedURLException e) { e.printStackTrace(); } return new UrlResource(path); } return super.getResource(location); } }
其中评论中提到另一个解决方案:
log4j.properties中添加:log4j.logger.org.springframework.mock.web.MockServletContext=error
该方法只是屏蔽了控制台的输出,但是测试还是没有通过,所以是不行的!
三、总结
1、为何testDeal()测试方法通过,而testWelcome()测试方法没有通过呢?
其原因是:testDeal()对应的LoginAction deal()方法return为null,而testWelcome()对应的LoginAction welcome()方法return为success,会对应WEB-INF/jsp/user/login.jsp,由于它默认是查找classpath下的路径,所以找不到报错,这就是为什么要重写ResourceLoader的原因。
说明:这个是否出错与你写的Action有关,只是本例是这么写的。
2、getContextLocations默认查找的是classpath*:applicationContext.xml,所以本例中的getContextLocations()方法可以不复写。
3、若测试类不添加@RunWith(SpringJUnit4ClassRunner.class) @TestExecutionListeners({})注解则不能使用@Ignore忽略测试,而且默认是所有方法都进行测试,即默认添加了@Test注解,但是加了前面两个注解后,JUnit4的注解都能正常使用,目前还不明白是为何?
附录
最后再把LoginAction补齐:
@SuppressWarnings("serial") @Namespace("/user") public class LoginAction extends StrutsAction<User> { @Autowired private UserService userService; public String welcome() { logger.info("登录页面"); return SUCCESS; } /** * 登录 * @return * @throws UnsupportedEncodingException */ public String deal() throws UnsupportedEncodingException { Result result = null; boolean flag = userService.exist(model.getUsername()); if(flag) {//登录 flag = userService.exist(model); if(flag) { //保存user对象到session中 Map<String, Object> session = ActionContext.getContext().getSession(); session.put("username", model.getUsername()); String resultUrl = Struts2Utils.getRequest().getContextPath() + "/main.action"; result = new Result(Result.SUCCESS, "", resultUrl); } else { result = new Result(Result.ERROR, "密码错误", ""); } } else { result = new Result(Result.ERROR, "用户不存在", ""); } Struts2Utils.renderText(result); return null; } /** * 退出 * @return */ public String logout() { Map<String, Object> session = ActionContext.getContext().getSession(); session.remove("username"); return "logout"; } }
相关推荐
- 然后,配置Struts2的核心过滤器,在web.xml中指定`struts2-convention-plugin`,这样Struts2会自动识别注解进行Action配置。 - 接着,配置Spring,创建Spring的配置文件,使用`@Configuration`注解声明这是一个...
Struts2、iBatis和Spring是Java Web开发中非常重要的三个框架,它们各自负责不同的职责,但可以协同工作以实现高效、灵活的应用程序。在本整合实例中,我们将探讨如何将这三个组件集成到一起,形成一个强大的后端...
6. **测试与调试**:Struts2提供了一套测试工具,如`struts2-test-plugin.jar`,可以帮助开发者进行单元测试和集成测试,确保应用的稳定性和正确性。 7. **国际化与本地化**:Struts2支持多语言环境,开发者可以...
6. **测试和支持库**:为了方便测试和调试,可能会包含一些测试相关的jar包,例如`struts2-test-plugin.jar`。 使用Struts2时,开发者需要在Web应用的`web.xml`中配置Struts2的前端控制器Filter,比如`...
- `struts2-test-plugin.jar`: 提供了单元测试和集成测试的支持,如Struts2 TestNG插件,帮助开发者验证Action的正确性。 10. **注解支持** - `struts2-spring-plugin.jar` 或 `struts2-struts1-plugin.jar`: ...
- `struts2-test-plugin.jar`:提供测试工具和插件,如JUnit集成,帮助开发者进行单元测试和集成测试。 7. **安全相关**: - `struts2-spring-plugin.jar`:与Spring框架集成,实现依赖注入,提高代码的可测试性...
9. **测试支持**:Struts2提供了测试工具,如`struts2-test-plugin.jar`,方便进行单元测试和集成测试。 在使用Struts2.3.34的依赖jar包时,你需要确保它们与你的项目其他依赖相兼容,并正确配置你的`pom.xml`...
7. **测试支持**:struts2-test-plugin.jar为单元测试和集成测试提供了便利。 8. **其他**:还有一些其他的库,如servlet-api.jar、log4j.jar等,它们分别是Servlet API和日志管理的支持库。 在开发过程中,理解每...
Struts2还提供了测试工具,如`struts2-test-plugin`,便于开发者进行单元测试和集成测试,确保代码质量。 10. **配置与约定优于配置** Struts2的配置方式灵活多样,可以使用XML、注解或基于约定的配置。这降低了...
7. **测试支持**:在开发过程中,`struts2-test-plugin.jar`或`mock-struts2.jar`可以帮助进行单元测试和模拟请求。 8. **国际化和本地化**:`struts2-i18n-plugin.jar`支持多语言环境,允许应用程序根据用户所在的...
测试包提供了单元测试和集成测试的支持,使得开发者可以更容易地对Struts2应用进行测试,确保代码质量。 6. **示例包(struts2-examples)** 示例包通常包含了一些预配置的示例应用,展示了Struts2框架的基本用法和...
在Struts2中,注解被用来标注控制器类、方法以及它们的行为,简化了原本需要在`struts.xml`中定义的动作配置。 例如,`@Action`注解用于标记一个类作为Struts2的Action,这个类将处理来自客户端的请求。你可以指定...
8. **测试支持**:Struts 2还提供了测试工具,如`struts2-test-plugin.jar`,可以帮助开发者进行单元测试和集成测试。 总之,"struts-2.3.15.1-lib.zip"是一个完整的Struts 2开发环境包,涵盖了框架的所有核心组件...
7. **测试支持**:`struts2-test-plugin.jar`提供了JUnit集成,方便进行单元测试和集成测试。 8. **其他辅助库**:如`struts2-spring-plugin.jar`用于与Spring框架的集成,`struts2-tiles-plugin.jar`则提供了对...
在Struts2项目中,`.classpath`可能包含了Struts2框架的库,如`struts2-core.jar`、`struts2-convention-plugin.jar`等,以及其他的依赖库,如Spring、Hibernate等。 2. `.project`:这是Eclipse项目的配置文件,...
为了开发和测试,`struts2-test-plugin.jar`提供了JUnit和Mocking工具,便于进行单元测试和集成测试。而`struts2-tiles-plugin.jar`则是针对Tiles框架的插件,用于构建复杂的页面布局。 除此之外,开发过程中还需要...
struts2-convention-plugin-2.5.2.jar, struts2-core-2.5.2.jar, struts2-dwr-plugin-2.5.2.jar, struts2-embeddedjsp-plugin-2.5.2.jar, struts2-gxp-plugin-2.5.2.jar, struts2-jasperreports-plugin-2.5.2.jar, ...
4.1.6.RELEASE.jar,spring-context-4.1.6.RELEASE.jar,spring-core-4.1.6.RELEASE.jar,spring-expression-4.1.6.RELEASE.jar,spring-test-4.1.6.RELEASE.jar,spring-web-4.1.6.RELEASE.jar,struts2-bean-validation-...
8. **测试与调试工具**:如`struts2-test-plugin.jar`,帮助开发者进行单元测试和性能测试。 9. **安全相关**:如`struts2-security-plugin.jar`,提供了安全相关的功能,如CSRF防护、XSS过滤等。 10. **其他辅助...
struts2-convention-plugin-2.3.30.jar, struts2-core-2.3.30.jar, struts2-dojo-plugin-2.3.30.jar, struts2-dwr-plugin-2.3.30.jar, struts2-embeddedjsp-plugin-2.3.30.jar, struts2-gxp-plugin-2.3.30.jar, ...