2013-03-14 4 views
0

У меня возникли проблемы с созданием модульных тестов, которые используют фреймворк 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 и что я могу с ним поделать?

+0

Похоже, у вас есть груз разных 'ClassLoader', которые сражаются. –

+0

Я провел некоторое тестирование, похоже, тот же загрузчик, проверяя proxy.getClass(). GetClassLoader(). Разве что-то еще мне нужно посмотреть? – WPrecht

+0

Пробовали ли вы 'toString' то, что у вас есть? Просто посмотреть, светит ли это свет? –

ответ

0

Решение:

Фиктивный стек ожидает полное имя класса действия вы насмехаясь за или иначе она предполагает ActionSupport. Эта строка:

proxy = dispatcher.getContainer().getInstance(ActionProxyFactory.class) 
     .createActionProxy(namespace, actionName, methodName, null, false, false); 

Не один учебник или введение в тестирование Junit на Struts упоминает об этом. На самом деле, большинство из них досадно трудно получить компиляцию вообще, если вы уже не являетесь мастером Spring.

Смежные вопросы