當引用了驗證框架的時候,測試
action
的時候,程序會自動去找驗證框架進行驗證,那么如何進行這種情況下的
action
測試呢?經過一天的研究,發現必須先將驗證所需要的
xml
文件夾在進去,然后才能夠順利的進行!具體的實施如下:
???
protected
void
setUp()
throws
Exception
{
???????
super
.setUp();
???????
// set WEB-INF directory
???????
setContextDirectory(
new
File(
"WebContent"
));
???????
// set struts-
test
-config.xml
???????
setConfigFile(
"/WEB-INF/test/struts-test-config.xml"
);
???????
???????
// set request's attribute for test
??????? //
創建一個
MessageResourcesFactory
類,目的是得到下面的
MessageResources,
作為其中的一個參數
MessageResourcesFactory
messageResourcesFactory
=
new
PropertyMessageResourcesFactory();
//
獲得
MessageResources
MessageResources
messageResources
=
new
PropertyMessageResources(messageResourcesFactory,
"org.apache.struts.action.ActionResources"
);?
?
?
getActionServlet().getServletContext().setAttribute(
"org.apache.commons.validator.VALIDATOR_RESOURCES"
,getResources());
????????
????????????????????????
?
getActionServlet().getServletContext().setAttribute(
"org.apache.struts.action.MESSAGE"
,messageResources);
???
}
?
以下的方法為了得到一個
MessageResources
,是從
org.apache.struts.validator. ValidatorPlugIn
中的
initResources
()方法得到的!
/**
?
*
get
the
validator
resources.
?
*
?
*
@throws
IOException
?????
if
an
input/output
error
is
encountered
?
*
@throws
ServletException
if
we
cannot
initialize
these
resources
?
*/
protected
ValidatorResources
getResources()
throws
IOException,
ServletException
{
String
pathnames
=
"/WEB-INF/validator-rules.xml,/WEB-INF/test/struts-test-config.xml"
;
???????
StringTokenizer
st
=
new
StringTokenizer(pathnames,
","
);
?
???????
List
streamList
=
new
ArrayList();
???????
try
{
???????????
while
(st.hasMoreTokens())
{
???????????????
String
validatorRules
=
st.nextToken().trim();
???????????????
if
(log.isInfoEnabled())
{
???????????????????
log.info(
"Loading validation rules file from '"
+
validatorRules
+
"'"
);
???????????????
}
?
???????????????
InputStream
input
=getActionServlet().getServletContext().getResourceAsStream(validatorRules);
???????????????
???????????????
// If the config isn't in the servlet context, try the class loader
???????????????
// which allows the config files to be stored in a jar
???????????????
if
(input
==
null
)
{
???????????????????
input
=
getClass().getResourceAsStream(validatorRules);
???????????????
}
?
???????????????
if
(input
!=
null
)
{
???????????????????
BufferedInputStream
bis
=
new
BufferedInputStream(input);
???????????????????
streamList.add(bis);
???????????????
}
else
{
???????????????????
throw
new
ServletException(
"Skipping validation rules file from '"
???????????????????????????
?
+
validatorRules
+
"'.? No stream could be opened."
);
???????????????
}
???????????
}
???????????
int
streamSize
=
streamList.size();
???????????
InputStream[]
streamArray
=
new
InputStream[streamSize];
???????????
for
(
int
streamIndex
=
0;streamIndex
<
streamSize;streamIndex++)
{
???????????????
InputStream
is
=
(InputStream)
streamList.get(streamIndex);
???????????????
streamArray[streamIndex]
=
is;
???????????
}
?
???????????
return
new
ValidatorResources(streamArray);
???????
}
catch
(SAXException
sex)
{
???????????
log.error(
"Skipping all validation"
,sex);
???????????
throw
new
ServletException(sex);
???????
}
finally
{
???????????
Iterator
streamIterator
=
streamList.iterator();
???????????
while
(streamIterator.hasNext())
{
???????????????
InputStream
is
=
(InputStream)
streamIterator.next();
???????????????
is.close();
???????????
}
???????
}
???
}
?
通過這樣的配置以后,就可以正常的對于
action
進行測試了!