Java 如何在SpringMVC2.5项目中使用MockMvc?

Java 如何在SpringMVC2.5项目中使用MockMvc?,java,spring,Java,Spring,MockMvc在Spring测试3.2中引入。我有一个依赖SpringMVC2.5的老项目,它很难升级(有太多的东西需要解决)。我想用MockMvc做集成测试 代码如下: import static org.hamcrest.CoreMatchers.containsString; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.spr

MockMvc在Spring测试3.2中引入。我有一个依赖SpringMVC2.5的老项目,它很难升级(有太多的东西需要解决)。我想用MockMvc做集成测试

代码如下:

import static org.hamcrest.CoreMatchers.containsString;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import java.io.IOException;

import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import redis.embedded.RedisServer;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/afdspplicationContext*.xml",
        "/applicationContext*.xml"})
@WebAppConfiguration
public class ScheduleControllerTest {
    private static RedisServer redisServer;
    @Autowired
    private WebApplicationContext wac;

    private MockMvc mockMvc;
    @BeforeClass
    public static void setUp() throws IOException {

        redisServer = new RedisServer(45678);
        redisServer.start();
    }

    @Before
    public void setup() throws Exception {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
    }

    @AfterClass
    public static void tearDown() {
        redisServer.stop();
    }
    @Test
    public void getRoomStatusByDateAndBuilding() throws Exception {

        this.mockMvc.perform(get("/api/v1/recommend/checkin?userName=dd&roomName=f"))
                .andExpect(status().isOk())
                .andExpect(content().string(containsString("\"code\":422")))
                .andExpect(content().string(containsString("test")));
    }
}
然而,测试最终出现了错误:

objc[77723]:JavaLaunchHelper类在这两种语言中都实现 /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/bin/Java (0x10bc614c0)和 /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/libinstrument.dylib (0x10bcd14e0)。将使用其中一个。哪一个是未定义的

java.lang.IllegalStateException:无法加载 CacheAwareContextLoaderDelegate[类 org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate]

在 org.springframework.test.context.BootstrapUtils.createCacheAwareContextLoaderDelegate(BootstrapUtils.java:101) 在 org.springframework.test.context.BootstrapUtils.createBootstrapContext(BootstrapUtils.java:70) 在 TestContextManager(TestContextManager.java:105) 在 org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTestContextManager(SpringJUnit4ClassRunner.java:152) 在 org.springframework.test.context.junit4.SpringJUnit4ClassRunner.(SpringJUnit4ClassRunner.java:143) 在sun.reflect.nativeConstructor附件mpl.newInstance0(本机 方法)在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 位于java.lang.reflect.Constructor.newInstance(Constructor.java:526) 在 org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104) 在 org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86) 在 org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) 在 org.junit.internal.builders.AllDefaultPossibilityBuilder.runnerForClass(AllDefaultPossibilityBuilder.java:26) 在 org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) 在 org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33) 在 JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:49) 在 intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) 在 com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) 在 com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) 原因:java.lang.NoSuchMethodError: 实例化类(Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/Object; 在 org.springframework.test.context.BootstrapUtils.createCacheAwareContextLoaderDelegate(BootstrapUtils.java:98) ... 还有18个

进程已完成,退出代码为255


可能是因为弹簧MVC 2.5与弹簧测试4.3.9不匹配而出现此错误。是否存在任何解决方法,让我在继续使用Spring MVC 2.5的同时使用MockMvc?

Spring 2.5是11年前(2007年11月19日)发布的,并且没有正式支持您尝试使用的Java 7。根据:

  • 完全支持Java6和JavaEE5(JDBC4.0、JTA1.1、JavaMail 1.4、JAX-WS2.0)
您正在运行一个非常不寻常且容易出错的设置。自行升级Spring或recreate和backport
MockMvc
framework,并降级到Java 6。不要混合使用2.5和3.2依赖项,这将产生很多类路径问题,就像您刚才观察到的那样


我认为11年后升级Spring并不是开发者最糟糕的投资。

你不能。千万不要混用框架不同版本的jar,否则会导致问题。将整个框架升级到一个更新的版本(通常是替换版本)。