(Sorry, hit the wrong key combination and hit send without meaning to...)
I am attempting to do some out-of-container testing of a Struts Action
which extends StrutsSpringTestCase. I've tried configuring the
application context two separate ways: via the @ContextConfiguration
annotation and by overriding getContextLocations(), with no luck.
The project is set up on a "standard" Maven2 layout, so the
/src/test/resources directory has its own copy of
applicationContext.xml. However, on attempting to run the unit test, I
get a NullPointerException when my code tries to call
getActionProxy(). Here's the Exception text:
java.lang.NullPointerException
at
org.apache.struts2.StrutsTestCase.getActionProxy(StrutsTestCase.java:130)
at
org.jason.application.web.actions.struts2.TestLoginAction.testRegister(TestLoginAction.java:72)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at
org.springframework.test.context.junit4.SpringTestMethod.invoke(SpringTestMethod.java:160)
Here's the code:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:applicationContext.xml"})
public class TestLoginAction extends StrutsSpringTestCase {
private AccountService accountService; // Mock AccountService
object, we'll need it for testing register()
@Before
public void setUp() {
accountService = EasyMock.createMock(AccountService.class);
}
@Override
protected String getContextLocations() {
return "classpath*:applicationContext.xml";
}
@Test
public void testRegister() throws Exception {
// setup the account we expect to be a duplicate
Account duplicateAccount = new Account();
duplicateAccount.setFirstName("Duplicate");
duplicateAccount.setLastName("Account");
duplicateAccount.setOrganization("None");
// setup the account we expect to be good
Account goodAccount = new Account();
duplicateAccount.setFirstName("John");
duplicateAccount.setLastName("Smith");
duplicateAccount.setOrganization("None");
Account goodAccountPopulated = goodAccount;
goodAccount.setId(501);
// setup the mock object
EasyMock.expect(accountService.createAccount(duplicateAccount))
.andThrow(new DuplicateUsernameException("Account name
already exists"));
EasyMock.expect(accountService.createAccount(goodAccount)).andReturn(goodAccountPopulated).anyTimes();
EasyMock.replay();
// get the action
ActionProxy proxy = getActionProxy("/login/register");
LoginAction action = (LoginAction) proxy.getAction();
// inject the mock into the action
action.setAccountService(accountService);
// test for validation errors
request.setParameter("model.lastName", "MyLastName");
request.setParameter("model.organization", "None");
String result0 = proxy.execute();
assertTrue("Problem: result of registration attempt without
required fields should have returned INPUT",
result0.equals("input"));
assertTrue("Problem: field model.firstName not included in
fieldErrors but should have been",
action.getFieldErrors().containsKey("model.firstName"));
// test for duplicate registration
request.setParameter("model.firstName","Duplicate");
request.setParameter("model.lastName", "Username");
request.setParameter("model.organization", "None");
String result1 = proxy.execute();
assertTrue("Problem: result of duplicate registration attempt
should have returned INPUT"
,result1.equals("input")); // ensure the error
result was returned
assertTrue("Problem: no errors were present in fieldErrors but
should have been", action.getFieldErrors().size() > 0);
}
}
Any ideas out there?
Jason
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]