【问题标题】:How to inject MockMvc in Spring Boot?如何在 Spring Boot 中注入 MockMvc?
【发布时间】:2018-07-28 13:02:35
【问题描述】:

我正在关注这篇关于 Spring Boot 集成测试的教程:http://www.baeldung.com/spring-boot-testing

好吧,但是当我尝试注入 MockMvc 时,我总是得到:

在类路径中定义名称为“mockMvcBuilder”的 bean 创建错误 资源 [org/springframework/boot/test/autoconfigure/web/servlet/MockMvcAutoConfiguration.class]: 通过工厂方法实例化 Bean 失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:失败 实例化 [org.springframework.test.web.servlet.setup.DefaultMockMvcBuilder]: 工厂方法“mockMvcBuilder”抛出异常;嵌套异常是 java.lang.NoClassDefFoundError: org/springframework/web/servlet/DispatcherServlet

我的测试课是:

@RunWith(SpringRunner.class)
@SpringBootTest(
        webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
        classes = MyApplication.class)
@AutoConfigureMockMvc
public class MyControllerIntegrationTest {

    @Inject
    private MockMvc mockMvc;

    //Some code here

好吧,我可以看到它找不到 DispatcherServlet,但我不确定为什么会发生这种情况......测试接缝是正确的。

有人知道我错过了什么吗?

编辑:

这是我的 POM 的相关部分:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RC1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jersey</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.2</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </pluginRepository>
        <pluginRepository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>

【问题讨论】:

  • 看起来您的项目中没有实际的 Web 依赖项。发布您的 POM/build.gradle.
  • @chrylis 检查我的编辑
  • 我在任何地方都没有看到spring-boot-starter-web
  • 我使用的是 Jersey 而不是 Spring web。但是,无论如何,我会尝试包含启动器网络
  • 如果您没有使用 Spring MVC,则 MockMvc 不可用——它不是您实际运行的堆栈。

标签: java spring spring-boot spring-test


【解决方案1】:

MockMvc 顾名思义,是 Spring 的 Web MVC 基础架构的模拟堆栈(带有模拟的请求、响应等)。由于您使用的是 Jersey,因此您将无法使用 MockMvc 进行测试。使用 Boot,您可能希望使用 @SpringBootTest 在随机端口上启动容器,并使用 TestRestTemplate 发出(真实的、本地的)HTTP 请求以进行测试。

【讨论】:

    猜你喜欢
    • 2019-08-05
    • 2017-01-05
    • 2023-03-12
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    相关资源
    最近更新 更多