Java 为单元测试创建对象MockHttpServletResponse时出错

Java 为单元测试创建对象MockHttpServletResponse时出错,java,spring,unit-testing,maven,mockito,Java,Spring,Unit Testing,Maven,Mockito,我试图使用sprint测试为Servlet编写单元测试 模拟对象 我的maven依赖性是: <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.0.3.RELEASE</version> </dependency> 我的代码是:

我试图使用sprint测试为Servlet编写单元测试 模拟对象

  • 我的maven依赖性是:

    <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-test</artifactId>
       <version>4.0.3.RELEASE</version>
    </dependency>
    
    我的代码是:

        package sample;
        import static org.junit.Assert.assertEquals;
        import org.junit.Test;
        import org.springframework.mock.web.MockHttpServletRequest;
        import org.springframework.mock.web.MockHttpServletResponse;
    
        public class SprintTestProb {
    
        @Test
        public void wrongPasswordShouldRedirectToErrorPage() throws Exception {
            MockHttpServletRequest request = new MockHttpServletRequest();
            MockHttpServletResponse response = new MockHttpServletResponse();
            request.addParameter("j_username", "gyanu");
            request.addParameter("j_password", "wrongpassword");
            LoginServlet login = new LoginServlet();
            login.setValid(false);
            login.doPost(request, response);
            assertEquals("/invalidlogin", response.getRedirectedUrl());
        }
    
    }
    
    我在第行MockHttpServletResponse=new MockHttpServletResponse()上出错 详情如下:

    java.lang.ExceptionInInitializerError
        at org.springframework.mock.web.MockHttpServletResponse.<init>(MockHttpServletResponse.java:76)
        at sample.SprintTestProb.wrongPasswordShouldRedirectToErrorPage(SprintTestProb.java:14)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
        at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
        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)
    Caused by: java.util.MissingResourceException: Can't find bundle for base name javax.servlet.LocalStrings, locale en_US
        at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:1499)
        at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1322)
        at java.util.ResourceBundle.getBundle(ResourceBundle.java:721)
        at javax.servlet.ServletOutputStream.<clinit>(ServletOutputStream.java:87)
        ... 25 more
    
    java.lang.ExceptionInInitializeError
    位于org.springframework.mock.web.MockHttpServletResponse。(MockHttpServletResponse.java:76)
    在sample.SprintTestProb.ErrorPasswordShouldRedirectToErrorPage(SprintTestProb.java:14)
    在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
    在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
    在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
    位于java.lang.reflect.Method.invoke(Method.java:606)
    位于org.junit.runners.model.FrameworkMethod$1.runReflectVeCall(FrameworkMethod.java:47)
    位于org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    位于org.junit.runners.model.FrameworkMethod.invokeeexplosive(FrameworkMethod.java:44)
    位于org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    位于org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
    位于org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
    位于org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    位于org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    位于org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    位于org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    访问org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    位于org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    位于org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    位于org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    位于org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
    原因:java.util.MissingResourceException:找不到基名称javax.servlet.LocalString、locale en_US的捆绑包
    位于java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:1499)
    位于java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1322)
    位于java.util.ResourceBundle.getBundle(ResourceBundle.java:721)
    位于javax.servlet.ServletOutputStream。(ServletOutputStream.java:87)
    ... 25多
    
    根据说明,您应该使用注释自动连接模拟。spring参考中的示例如下:

    `

    `


    可以找到一个不同的示例(没有注释)

    我需要用javax.selvlet-api替换javaee api的依赖关系,如下所示:

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
    </dependency>
    
    
    javax.servlet
    javax.servlet-api
    3.1.0
    
    我遇到了一个类似的问题,通过将此依赖项添加到我的pom中解决了它,无需将javaee api更改为javax.servlet

    <dependency>
     <groupId>org.mortbay.jetty</groupId>
     <artifactId>servlet-api-2.5</artifactId>
     <version>6.1.11</version>
    </dependency>
    
    
    org.mortbay.jetty
    servlet-api-2.5
    6.1.11
    
    测试了代码,就像您上面提供的一样,但它对我有效,没有错误。您能在pom中发布pom配置吗:junit 4.7、javax.servlet-api 3.0.1、spring test 4.0.3、spring context 4.0.3我的错误是使用javaee api,使用javax.servlet-api解决了。非常感谢。在java中,我们可以根据我们工作的服务器找到许多库实现,在您的例子中,您使用的是jetty实现。您还可以检查glassfish、tomcat以及更多。因此,我也遇到了同样的问题,只是我将J2EEAPI7列为依赖项(已提供)。我认为这包括ServletAPI,但当我像上面那样添加ServletAPI+时,它解决了我的问题。究竟为什么这样做?似乎j2ee api只包含可用于编译的j2ee api。它不包含方法体,因此无法用于运行或部署。我的理解是,servlet api只是更大的j2ee api的一个子集。你是说事实并非如此?
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
    </dependency>
    
    <dependency>
     <groupId>org.mortbay.jetty</groupId>
     <artifactId>servlet-api-2.5</artifactId>
     <version>6.1.11</version>
    </dependency>