У меня возникли проблемы с созданием модульных тестов, которые используют фреймворк Spring, который поставляется с Struts 2.3.8. В принципе, у меня есть BaseTestCase, который создает фреймворк. И затем отдельные тестовые примеры, которые звонят в него. Выйдя из createAction с издевались до действия я получаю:CastClassException Создание тестового примера для действия Struts2
java.lang.ClassCastException: com.opensymphony.xwork2.ActionSupport incompatible with com.lm.learn.action.LoginAction
at com.lm.learn.action.LoginActionTest.testUsername(LoginActionTest.java:18)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
at java.lang.reflect.Method.invoke(Method.java:611)
at junit.framework.TestCase.runTest(TestCase.java:164)
at junit.framework.TestCase.runBare(TestCase.java:130)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:120)
at junit.framework.TestSuite.runTest(TestSuite.java:230)
at junit.framework.TestSuite.run(TestSuite.java:225)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Что это любопытно, потому что класс действия extends ActionSupport
. Я должен упустить что-то основное, так как это тривиальный пример. К сожалению, я вообще не знаю Весны.
Здесь (урезанная) Класс действий:
public class LoginAction extends ActionSupport {
private static final long serialVersionUID = -8123618443227375443L;
private String username;
private String password;
private User user;
public String execute() {
user = new User(username, password);
if (validateLogin(user)) {
return SUCCESS;
} else {
addActionError(getText("error.login"));
return ERROR;
}
}
И тест (взрывает на первой линии):
public void testUsername() throws Exception {
action = (LoginAction) createAction(LoginAction.class, "/", "LoginAction", "execute");
Map<String, Object> p = new HashMap<String, Object>();
p.put("user.userName", "admin");
p.put("user.password", "admin");
proxy.getInvocation().getInvocationContext().setParameters(p);
String result = proxy.execute();
assertEquals(result, "success");
}
И baseCase, что издевается стек:
protected <T> T createAction(Class<T> clazz, String namespace, String actionName, String methodName) throws Exception {
proxy = dispatcher.getContainer().getInstance(ActionProxyFactory.class)
.createActionProxy(namespace, actionName, methodName, null, false, false);
proxy.getInvocation().getInvocationContext().setParameters(new HashMap<String, Object>());
proxy.setExecuteResult(false);
ServletActionContext.setContext(proxy.getInvocation().getInvocationContext());
return (T) proxy.getAction();
}
Почему я получаю исключение ClassCast и что я могу с ним поделать?
Похоже, у вас есть груз разных 'ClassLoader', которые сражаются. –
Я провел некоторое тестирование, похоже, тот же загрузчик, проверяя proxy.getClass(). GetClassLoader(). Разве что-то еще мне нужно посмотреть? – WPrecht
Пробовали ли вы 'toString' то, что у вас есть? Просто посмотреть, светит ли это свет? –