使用MockRoundtrip类时出现问题

时间:2011-01-13 16:37:28

标签: spring junit stripes

我有以下代码:

@Test
 public void testSaveValid() throws Exception {
  MockRoundtrip trip = new MockRoundtrip(mockServletContext,
    ContactFormActionBean.class, mockSession);

  trip.setParameter("contact.email", "test@test.com");
  trip.setParameter("contact.phoneNumber", "654-456-4567");
  trip.execute("save");

  ContactFormActionBean bean =
   trip.getActionBean(ContactFormActionBean.class);

  assertEquals(0,
    bean.getContext().getValidationErrors().size());

  PhoneNumber pn = bean.getContact().getPhoneNumber();
  assertEquals("654", pn.getAreaCode());
  assertEquals("456", pn.getPrefix());
  assertEquals("4567", pn.getSuffix());

  assertTrue(
    trip.getDestination().startsWith("/ContactList.action"));
 }

我遇到这个错误:

net.sourceforge.stripes.exception.StripesServletException: Unhandled exception in exception handler.
 at net.sourceforge.stripes.exception.DefaultExceptionHandler.handle(DefaultExceptionHandler.java:158)
 at net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:249)
 at net.sourceforge.stripes.mock.MockFilterChain.doFilter(MockFilterChain.java:63)
 at net.sourceforge.stripes.mock.MockServletContext.acceptRequest(MockServletContext.java:255)
 at net.sourceforge.stripes.mock.MockRoundtrip.execute(MockRoundtrip.java:195)
 at net.sourceforge.stripes.mock.MockRoundtrip.execute(MockRoundtrip.java:207)
 at stripesbook.test.stripesmock.ContactFormActionBeanTest.testSaveValid(ContactFormActionBeanTest.java:96)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:585)
 at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
 at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
 at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
 at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
 at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
 at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
 at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
 at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
 at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
 at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
 at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
 at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
 at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
 at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
 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)

如果我删除

trip.setParameter("contact.email", "test@test.com");
trip.setParameter("contact.phoneNumber", "654-456-4567");

我不会收到任何错误,但会从jUnit获得以下消息:

java.lang.AssertionError: expected:<0> but was:<1>

这似乎合乎逻辑。 这是我的ContactFormActionBean类

public class ContactFormActionBean extends ContactBaseActionBean {
private static final String FORM="/WEB-INF/jsp/contact_form.jsp";

@DefaultHandler
public Resolution form() {
    return new ForwardResolution(FORM);
}
public Resolution save() {
    Contact contact = getContact();
    contact.setUser(getUser());
    contactDao.save(contact);
    contactDao.commit();
    getContext().getMessages().add(
        getLocalizableMessage("contactSaved", contact)
    );
    return new RedirectResolution(ContactListActionBean.class);
}
@ValidationMethod(on="save")
public void validateEmailUnique(ValidationErrors errors) {
    String email = getContact().getEmail();
    Contact other = contactDao.findByEmail(email, getUser());
    if (other != null && !other.equals(getContact())) {
        errors.add("contact.email", new LocalizableError(
          getClass().getName()+".contactEmailAlreadyUsed", other));
    }
    }
}

为什么会出现这种错误?

[ADDED]

这是我的Setup()函数,我在运行任何测试函数之前配置了mockServletContext:

... 
    private static MockServletContext mockServletContext;
    private static MockHttpSession mockSession;

    @BeforeClass
    public static void setup() throws Exception {
        mockServletContext = new MockServletContext("webmail");

        Map<String,String> params = new HashMap<String,String>();
        params.put("ActionResolver.Packages", "stripesbook.action");

        params.put("Extension.Packages", "stripesbook.ext,"
                + "net.sourceforge.stripes.integration.spring");

        mockServletContext.addFilter(StripesFilter.class,
                "StripesFilter", params);

        mockServletContext.setServlet(DispatcherServlet.class,
                "DispatcherServlet", null);

        mockSession = new MockHttpSession(mockServletContext);


        mockServletContext.addInitParameter("contextConfigLocation",
        "/WEB-INF/applicationContext-test.xml");

        ContextLoaderListener springContextLoader =
            new ContextLoaderListener();
        springContextLoader.contextInitialized(
                new ServletContextEvent(mockServletContext));
        // Load mock user
        MockRoundtrip trip = new MockRoundtrip(mockServletContext,
                MockDataLoaderActionBean.class, mockSession);
        trip.execute();

        // Login mock user
        trip = new MockRoundtrip(mockServletContext,
                LoginActionBean.class, mockSession);
        trip.setParameter("username", "freddy");
        trip.setParameter("password", "nadia");
        trip.execute("login");
    }
...

我认为当我删除

时可能会出现一些配置问题
<classpathentry kind="src" path="src/main/webapp" /> 
从类路径

我得到不同的错误:

org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/applicationContext-test.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext-test.xml]

4 个答案:

答案 0 :(得分:1)

似乎存在Stripes配置问题。

您是否正确配置了mockServletContext

答案 1 :(得分:1)

你试过Spring吗?

我已经完成了:

Object test = springContextListener.getContextLoader()。getCurrentWebApplicationContext()。getBean(“MyActionBean”);

用你的类注释:@RunWith(SpringJUnit4ClassRunner.class)

答案 2 :(得分:0)

关于org.springframework.beans.factory.BeanDefinitionStoreException :从ServletContext资源解析XML文档的IOException [/WEB-INF/applicationContext-test.xml];嵌套异常是java.io.FileNotFoundException:无法打开ServletContext资源[/WEB-INF/applicationContext-test.xml]

添加:

@RunWith(SpringJUnit4ClassRunner.class 到您的测试类

并将Spring-test Jar添加到您的项目中。

答案 3 :(得分:0)

重新检查一行: filterParams.put(“ActionResolver.Packages”,“yourapplicationpackagesPath.action”);