Thanks to Chris, Gabriel for your comments.
I finally got this to work yesterday. A neat solution probably requires
refactoring StrutsTestCase and deriving a new class
(StrutsMultipartTestCase) from it. In the meantime the following changes
will work subject to a couple of limitations: -
This only supports upload of a single file - although fairly simple to
extend for multiple files.
I've use Mockito for a couple of mocks
It's not very clean :-(
First you need spring-web-x.y.z.jar on your classpath. This comes with the
junit plugin.
Your test class needs the following override. This is a cut & paste job from
StrutsTestCase except for the request creation line.
/**
* We need to override this method so we can use class
* MockMultipartHttpServletRequest for the request.
*/
@Override
protected void initServletMockObjects()
{
servletContext = new MockServletContext(resourceLoader);
response = new MockHttpServletResponse();
request = new MockMultipartHttpServletRequest();
pageContext = new MockPageContext(servletContext, request, response);
}
We now need a new version of getActionProxy with additional parameters as
follows: -
/**
* We need our own version to handle the file uploading
* @param uri struts action uri
* @param contentType mime content type
* @param filename name reported to action
* @param file uploaded file
* @return ActionProxy
*/
protected ActionProxy
getActionProxy (String uri, String contentType, String filename, File file)
{
// Create the proxy
ActionProxy result = super.getActionProxy (uri);
// Not part of upload but I think required for SessionAware
ActionContext context = result.getInvocation ().getInvocationContext
();
if (context.getSession () == null)
{
context.setSession (new HashMap ());
}
// Wrap the request in a MultiPartRequestWrapper
MultiPartRequest mpr =
createMultiPartRequest (contentType, filename,
file);
MultiPartRequestWrapper wrapper =
new MultiPartRequestWrapper (mpr, request, null);
ServletActionContext.setRequest (wrapper);
return result;
}
protected MultiPartRequest
createMultiPartRequest (String contentType, String fileName, File file)
{
MultiPartRequest result = Mockito.mock (MultiPartRequest.class);
Vector fileParameterNames = new Vector ();
fileParameterNames.add (PROP_NAME);
Enumeration enumFpn = fileParameterNames.elements ();
Mockito.when (result.getFileParameterNames ()).thenReturn (enumFpn);
String [] contentTypes = new String [1];
contentTypes [0] = contentType;
Mockito.when (result.getContentType (PROP_NAME)).thenReturn
(contentTypes);
String [] fileNames = new String [1];
fileNames [0] = fileName;
Mockito.when (result.getFileNames (PROP_NAME)).thenReturn
(fileNames);
File [] files = new File [1];
files [0] = file;
Mockito.when (result.getFile (PROP_NAME)).thenReturn (files);
return result;
}
private static final String PROP_NAME = "propertyName";
This assumes that your upload action has methods setPropertyName (File),
setPropertyNameContentType (String), setPropertyNameFileName (String).
The @Test methods now include the following: -
File uploadedFile = new File ("path to test file");
ActionProxy proxy = getActionProxy ("uri", "content type e.g. text/csv",
file.getName (), file);
assertTrue (proxy.execute ().equals ("expected action result");
Note that the calls to the action are generated internally. You don't need
any request.setParameter (...) calls.
Cheers,
Steve
-Original Message-
From: Steve Higham [mailto:st...@sjlt.co.uk]
Sent: 25 April 2012 11:08
To: 'Struts Users Mailing List'
Subject: StrutsTestCase, jUnit and file upload
I'm currently using StrutsTestCase and jUnit to component test my Actions
within the Struts context using a Mockito mock as my Model.
This is working fine. I can call request.setParamater ("paramName",
"paramValue") from the test class and, when executed, Struts will call the
corresponding setParamName ("paramValue") on my Action.
However I now wish to test "file upload" Actions. In normal use the
FileUploadInterceptor will call setUploadedFile (java.io.File file) on the
action. However I can't see any methods on the StrutsTestCase request object
which will prepare the request with an uploaded file. Has anyone got this to
work?
Steve Higham
-
To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
For additional commands, e-mail: user-h...@struts.apache.org