我刚刚升级到 Struts 2.3.1.2,并且在 JUnit 测试方面遇到了一些问题。
我的旧测试代码是这样的......
public class HomeActionTest {
@Test
public void testUserNameErrorMessage() throws Exception {
HomeAction action = new HomeAction();
setupMocks(action);
action.execute();
}
}
动作类的执行方法有代码
String text = getText(GLOBAL_SELECT);
这会在 LocalizedTextUtil 中导致 NullPointerException,因为它调用...
ActionContext.getContext()
现在我可以尝试这样做...
ActionContext.setContext(new ActionContext(new HashMap()));
但是我会得到一个 NullPointerException,因为上下文中的 Valuestack 是空的。我可以继续尝试解决这些问题,但这似乎是一项徒劳的任务。肯定有更好的办法?!?
好....
我遵循新的Struts 2.3.xx 测试文档
我的 struts.xml 与弹簧相连。
<action name="secure/home" class="homeAction" method="execute">
<result>home.jsp</result>
<result name="input">home.jsp</result>
<result name="error">error.jsp</result>
</action>
我的测试课
public class HomeActionTest extends StrutsSpringTestCase {
@Test
public void testUserNameErrorMessage() throws Exception {
ActionProxy proxy = getActionProxy("/secure/home");
// setup the session
Map<String, Object> session = new HashMap<String, Object>();
ActionContext actionContext = proxy.getInvocation().getInvocationContext();
actionContext.setSession(session);
HomeAction homeAction = (HomeAction) proxy.getAction();
proxy.execute();
}
}
但这现在意味着我得到了一个完全填充的 Spring 注入的 Action 类!大多数人会说“是的!!!” 在此刻。
我的问题是这不是一个 UNIT 测试类,它现在一直调用到 DB 层,因为这就是它在运行时的连接方式。
所以这是我的问题,我知道我花了一些时间来解决它,是否有可能获得一个可以访问所需资源的 Action 类(对于方法调用,例如 getText()),但不是所有的 Spring连线?
目前,我很想走反射路线以删除所有与我的操作匹配的 setServicexxxx 方法,至少那时我会在运行测试时得到 NullPointerException 并且我可以模拟该服务,但那是错误的。我希望我的测试很快,而不是花 2 秒来启动 Spring 上下文。
Struts2.3 是如何产生一个不遵循单元测试的口头禅的基础测试类的?
这在 Struts 2.0.9 (xwork-2.0.3.jar) 中一切正常。
我错过了什么?