使用cactus測試ssh應用(2)

接1

接下來就是考慮如何測試struts了,之前使用的是servelttestcase,不能作爲我實際應用的測試,不過有部分代碼可以借鑑,那就是jetty的啓動代碼(事實上,在linux下,使用tomcat和jetty啓動相差不了多少,時間都是耗在啓動spring的beans上,當然測試下最好還是輕量級別比較好)。

嘗試了cactusstrutstestcase和mockstrutstestcase,使用中發現,cactusstrutstestcase不查找begin開頭的方法,另外還是那個config問題,所以最終我還是選擇了mockstrutstestcase。

選擇了mockstrutstestcase之後,按照要求調用了superclass的setup和teardown,按照strutstestcase網站上的例子(後來,我看了另外《Struts Recipes》,應該說這本比較適合我的這次測試,不過看的時候我的測試快要完成了……)啓動,我知道這次啓動肯定不會成功。
因爲我把struts和spring整合過了,如果沒有注入commonServices(我所調用的loginAction的服務接口)的話,是不能通過測試的。不過這次顯示的是沒有找到配置文件……靠着搜索引擎的幫助,我找到了一個英文版的cactus+struts測試的例子,我注意到裏面提醒要設置上下文路徑。因爲例子中使用的是myeclipse編輯器(我以前用過,不過jsp編輯老是卡死,所以不用了)。我這裏使用的是netbeans,其實有點類似,因爲netbeans的工程結構和classpath不同,所以我必須設置上下文爲工程的web(因爲我並沒有啓動tomcat),那個netbeans放網頁什麼的地方。後來我發現這裏其實也有提示:
[url]http://www.blogjava.net/wangxq/archive/2005/08/22/10713.html[/url]

然後啓動jetty出現了我想象的contextlistener問題。單純沒有注入的struts類應用是沒有問題的,不過考慮到是ssh應用,我必須考慮如何注入。找如何啓動spring上下文,注入其實花了我很長時間,喫過一頓中飯,然後一直想這個問題頭很痛,又去睡了幾個小時。醒來的時候重新找資料,解決問題。

真得很痛苦,找到了資料,然後測試,雖然頭不疼了(估計是眼睛痛)。在javaeye的網站上找到了一篇可以使用的例子:
[url]http://www.iteye.com/topic/18492[/url]
按照我的習慣修改了其中的代碼,成功的界面:
[img]http://lh6.ggpht.com/_hEMQVYHGsAw/SZ-7Ct_UTsI/AAAAAAAAAZE/fEDedi3yBFs/s800/Screenshot-Hako%20-%20NetBeans%20IDE%206.5-2.png[/img]

接下來又是一個煩人的問題,就是假如我放入兩個test,其實這個testsuite會啓動兩次(因爲是在setup中啓動webapplicationcontext),即使是jetty也會很浪費時間。spring+cactus其實資料不是非常正式,看到的都是要麼偏spring(基本沒有cactus代碼的)或者偏cactus的。最終還是在搜索strutstestcase的時候找到了,找到了兩篇,其實內容是一樣的:
[url]http://www.searchfull.net/1171468.html[/url]
[url]http://tide2046.iteye.com/blog/210728[/url]

我注意到了裏面的JunitHelper,然後複製了裏面的代碼,按照我自己的習慣修改了代碼,最終測試結果如下:
[img]http://lh6.ggpht.com/_hEMQVYHGsAw/SZ_WrDtKeZI/AAAAAAAAAZY/ees1iRk9jvo/s800/Screenshot-Hako%20-%20NetBeans%20IDE%206.5-3.png[/img]

到此基本上就完成了,最終的代碼如下:

首先是保存webapplicationcontext的類(靜態內容)
package cn.edu.shu.lehu.hako.tests.actions;

import javax.servlet.ServletContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.web.context.support.XmlWebApplicationContext;
import org.springframework.web.context.WebApplicationContext;

/**
*
* @author xnnyygn
*/
public class SpringWebContextHelper {

public static String[] Configuration_Location;
private static XmlWebApplicationContext wac = null;
private static ClassPathXmlApplicationContext fsxac = null;


static {
Configuration_Location = new String[]{
"/WEB-INF/spring-base.xml",
"/WEB-INF/spring-services.xml",
"/WEB-INF/spring-struts.xml"};
}

public static void setWebApplicationContext(ServletContext context) {

if (context.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE) != null) {
return;
}

if (wac == null) {
wac = new XmlWebApplicationContext();
wac.setServletContext(context);
wac.setConfigLocations(Configuration_Location);
wac.refresh();
}

context.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, wac);
}
}


然後是啓動jetty的類,實際測試過,貌似用swingui或者awtui會出錯,不太清楚原因。
package cn.edu.shu.lehu.hako.tests.actions;

import junit.framework.Test;
import junit.framework.TestSuite;
import org.apache.cactus.extension.jetty.Jetty5xTestSetup;

/**
*
* @author xnnyygn
*/
public class TestAllWithJetty {

public static Test suite() {
System.setProperty("cactus.contextURL", "your webapp url here");
TestSuite testSuite = new TestSuite("All test with jetty");
testSuite.addTestSuite(TestLoginAction.class);
return new Jetty5xTestSetup(testSuite);
}

public static void main(String[] args) {
junit.textui.TestRunner.run(TestAllWithJetty.suite());
}
}


最後是有兩個測試方法的類:
package cn.edu.shu.lehu.hako.tests.actions;

import cn.edu.shu.lehu.hako.struts.forms.LoginForm;
import java.io.File;

import servletunit.struts.MockStrutsTestCase;

/**
*
* @author xnnyygn
*/
public class TestLoginAction extends MockStrutsTestCase {

private LoginForm loginForm = new LoginForm();

public TestLoginAction(String testName) {
super(testName);
}

@Override
protected void setUp() throws Exception {
super.setUp();
setContextDirectory(new File("web"));
SpringWebContextHelper.setWebApplicationContext(context);
}

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

public void testCorrectLogin() {
setRequestPathInfo("/login");

loginForm.setUsername("username");
loginForm.setPassword("password");
setActionForm(loginForm);

actionPerform();
verifyNoActionErrors();
}

public void testInCorrectLogin() {
setRequestPathInfo("/login");

loginForm.setUsername("username");
loginForm.setPassword("password2");
setActionForm(loginForm);

actionPerform();
verifyInputForward();
}
}


最後是所使用的包名:
[quote]spring-mock-2.0-rc3.jar
commons-codec-1.3.jar
aspectjrt-1.5.3.jar
cactus-core-framework.uberjar.jar
httpunit.jar(這個不清楚是否必須)
junit-3.8.2.jar
org.mortbay.jetty-5.1.9.jar
strutstest-2.14.jar[/quote]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章