I'm following the approach given here for writing unit tests for actions:
http://depressedprogrammer.wordpress.com/2007/06/18/unit-testing-struts-2-actions-spring-junit/
My Problem:
I want to write a unit test that will verify that getSettings() returns
back a JSON string. However, when I run the test, it does not go
through the JSONResult type I have defined. I'm wondering if it has to
do with the BaseStrutsTestCase.createAction? I noticed a snip inside of
it that seems confusing (comment and code do not seem to agree)
<snip>
//do not execute the result after executing the action
proxy.setExecuteResult(true);
</snip>
I would figure if this is set to true, then it would go through my
result and I would be able to get the stream from the Mock Response and
check my JSON string. However, it doesn't seem to be the case.
Below are some code snippets to help paint a picture if more details are
required.
@Test
public void testGetSettings() throws Exception {
Setting s1 = new Setting();
s1.setId(0);
s1.setName("Rocket Man");
s1.setType(SettingType.STRING);
s1.setDefaultValue("She packed my bags last night pre-flight");
s1.setValue("Zero hour nine a.m.");
// Add the setting to a list.
List<Setting> settings = new ArrayList<Setting>(1);
settings.add(s1);
// Set the setting to the mock DAO
MockSettingDAO settingDAO = new MockSettingDAO(settings);
// Set the mock DAO on the service.
SettingServiceImpl settingService = new SettingServiceImpl();
settingService.setSettingDAO(settingDAO);
// Set the service on the action.
SettingAction action = createAction(SettingAction.class,
"/configManager", "settingAction_getSettings",
"getSettings");
action.setSettingService(settingService);
// Get the JSON string.
String result = action.getSettings();
// Check the result.
assertEquals(result, Action.SUCCESS);
MockHttpServletResponse response = (MockHttpServletResponse)
ServletActionContext
.getResponse();
String jsonResult = response.getContentAsString();
// Validation of jsonResult would happen here.
}
<snip_of_setting_service>
/**
* Get the settings as a JSON string.
*
* @return SUCCESS
*/
public String getSettings() {
List<Setting> settings = this.settingService.findAllSettings();
ActionContext.getContext().put("jsonResult", settings);
return Action.SUCCESS;
}
</snip_of_setting_service>
<snip_of_struts_xml>
<!--Result Types -->
<result-types>
<result-type name="JSONResult"
class="com.caris.sfe.web.configmanager.results.GenericJSONResult" />
</result-types>
</snip_of_struts_xml>
<snip_of_json_result>
@Override
public void execute(ActionInvocation arg0) throws Exception {
// retrieve your response, request and context objects.
ServletActionContext.getResponse().setContentType("text/plain");
HttpServletResponse response = ServletActionContext.getResponse();
Object jsonResult = ActionContext.getContext().get("jsonResult");
// Create your JSON object using third_party GSON library.
Gson gson = new Gson();
String gsonStr = "{\"Response\" : {\"Results\" : "
+ gson.toJson(jsonResult) + "}}";
// write it out to the outputstream so that JSP can read it
through the
// response object.
OutputStreamWriter outStreamWriter = new OutputStreamWriter(response
.getOutputStream());
outStreamWriter.write(gsonStr);
outStreamWriter.flush();
}
</snip_of_json_result>
---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
For additional commands, e-mail: user-h...@struts.apache.org