`
zhang90030
  • 浏览: 1644 次
社区版块
存档分类
最新评论

Spring Test + Struts2 Convention 控制层单元测试

阅读更多

第一次写博客,记录下今天学习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";
	}

	
}

 

 

  • 大小: 20.7 KB
分享到:
评论

相关推荐

    Struts2.3.28+spring4.1.6+hibernate4.3.8整合总结(注解)

    - 然后,配置Struts2的核心过滤器,在web.xml中指定`struts2-convention-plugin`,这样Struts2会自动识别注解进行Action配置。 - 接着,配置Spring,创建Spring的配置文件,使用`@Configuration`注解声明这是一个...

    struts2+ibatis-2.3+spring2.5整合实例

    Struts2、iBatis和Spring是Java Web开发中非常重要的三个框架,它们各自负责不同的职责,但可以协同工作以实现高效、灵活的应用程序。在本整合实例中,我们将探讨如何将这三个组件集成到一起,形成一个强大的后端...

    struts2官方最全jar包

    6. **测试与调试**:Struts2提供了一套测试工具,如`struts2-test-plugin.jar`,可以帮助开发者进行单元测试和集成测试,确保应用的稳定性和正确性。 7. **国际化与本地化**:Struts2支持多语言环境,开发者可以...

    struts2所有jar包

    6. **测试和支持库**:为了方便测试和调试,可能会包含一些测试相关的jar包,例如`struts2-test-plugin.jar`。 使用Struts2时,开发者需要在Web应用的`web.xml`中配置Struts2的前端控制器Filter,比如`...

    Struts2必需的jar包.zip

    - `struts2-test-plugin.jar`: 提供了单元测试和集成测试的支持,如Struts2 TestNG插件,帮助开发者验证Action的正确性。 10. **注解支持** - `struts2-spring-plugin.jar` 或 `struts2-struts1-plugin.jar`: ...

    Struts2常用jar包.rar

    - `struts2-test-plugin.jar`:提供测试工具和插件,如JUnit集成,帮助开发者进行单元测试和集成测试。 7. **安全相关**: - `struts2-spring-plugin.jar`:与Spring框架集成,实现依赖注入,提高代码的可测试性...

    struts2.3.34依赖jar包

    9. **测试支持**:Struts2提供了测试工具,如`struts2-test-plugin.jar`,方便进行单元测试和集成测试。 在使用Struts2.3.34的依赖jar包时,你需要确保它们与你的项目其他依赖相兼容,并正确配置你的`pom.xml`...

    struts-2.2.3-lib.zip struts2.jar 全部jar包

    7. **测试支持**:struts2-test-plugin.jar为单元测试和集成测试提供了便利。 8. **其他**:还有一些其他的库,如servlet-api.jar、log4j.jar等,它们分别是Servlet API和日志管理的支持库。 在开发过程中,理解每...

    struts2框架所需要的包

    Struts2还提供了测试工具,如`struts2-test-plugin`,便于开发者进行单元测试和集成测试,确保代码质量。 10. **配置与约定优于配置** Struts2的配置方式灵活多样,可以使用XML、注解或基于约定的配置。这降低了...

    struts2 jar包

    7. **测试支持**:在开发过程中,`struts2-test-plugin.jar`或`mock-struts2.jar`可以帮助进行单元测试和模拟请求。 8. **国际化和本地化**:`struts2-i18n-plugin.jar`支持多语言环境,允许应用程序根据用户所在的...

    Struts2包共7个包

    测试包提供了单元测试和集成测试的支持,使得开发者可以更容易地对Struts2应用进行测试,确保代码质量。 6. **示例包(struts2-examples)** 示例包通常包含了一些预配置的示例应用,展示了Struts2框架的基本用法和...

    struts2 使用注解现在零配置不需要在使用struts.xml配置文件,可以直接跑

    在Struts2中,注解被用来标注控制器类、方法以及它们的行为,简化了原本需要在`struts.xml`中定义的动作配置。 例如,`@Action`注解用于标记一个类作为Struts2的Action,这个类将处理来自客户端的请求。你可以指定...

    struts-2.3.15.1-lib.zip

    8. **测试支持**:Struts 2还提供了测试工具,如`struts2-test-plugin.jar`,可以帮助开发者进行单元测试和集成测试。 总之,"struts-2.3.15.1-lib.zip"是一个完整的Struts 2开发环境包,涵盖了框架的所有核心组件...

    struts-2.3.4.1 lib

    7. **测试支持**:`struts2-test-plugin.jar`提供了JUnit集成,方便进行单元测试和集成测试。 8. **其他辅助库**:如`struts2-spring-plugin.jar`用于与Spring框架的集成,`struts2-tiles-plugin.jar`则提供了对...

    struts2 代码

    在Struts2项目中,`.classpath`可能包含了Struts2框架的库,如`struts2-core.jar`、`struts2-convention-plugin.jar`等,以及其他的依赖库,如Spring、Hibernate等。 2. `.project`:这是Eclipse项目的配置文件,...

    struts常用架包及需要用到的架包

    为了开发和测试,`struts2-test-plugin.jar`提供了JUnit和Mocking工具,便于进行单元测试和集成测试。而`struts2-tiles-plugin.jar`则是针对Tiles框架的插件,用于构建复杂的页面布局。 除此之外,开发过程中还需要...

    struts-2.5.2-all所有jar包

    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, ...

    struts-2.5.10-all所有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-...

    struts-2.3.1.2 all.jar

    8. **测试与调试工具**:如`struts2-test-plugin.jar`,帮助开发者进行单元测试和性能测试。 9. **安全相关**:如`struts2-security-plugin.jar`,提供了安全相关的功能,如CSRF防护、XSS过滤等。 10. **其他辅助...

    struts-2.3.30-all所有jar包

    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, ...

Global site tag (gtag.js) - Google Analytics