在使用Spring Boot注入MockMvc时出现错误

5

我试图使用MockMvc,但它总是显示以下错误:

原因: org.springframework.beans.factory.NoSuchBeanDefinitionException: 没有可用的类型为'org.springframework.test.web.servlet.MockMvc'的限定bean:预计至少有1个bean符合自动装配候选条件。依赖注释: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

我的类:

@AutoConfigureMockMvc
@ExtendWith(SpringExtension.class)
@TestPropertySource(locations = "classpath:application-cliente.properties")
public class ClienteRepositoryTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private ClienteService clienteService;

    @Test
    public void simpleMockTest() throws Exception {
        var clienteMock = new Cliente("Jessica Pereira");
        Mockito.doReturn(Optional.of(clienteMock)).when(clienteService).buscar(2L);
        this.mockMvc.perform(MockMvcRequestBuilders.get("/api/clientes/pf/{id}", 1L))
                .andExpect(MockMvcResultMatchers.status().isOk());
    }
}

我的gradle
plugins {
    id 'org.springframework.boot' version '2.1.3.RELEASE'
    id 'java'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.rjdesenvolvimento'
version = '0.0.1'
sourceCompatibility = '11'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
    maven { url 'https://repo.spring.io/milestone' }
}

ext {
    set('springCloudVersion', 'Greenwich.SR1')
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.cloud:spring-cloud-starter-oauth2'
    implementation 'org.springframework.cloud:spring-cloud-starter-security'
    compileOnly 'org.projectlombok:lombok'
    compile('org.glassfish.jaxb:jaxb-runtime:2.3.1')
    runtimeOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'org.postgresql:postgresql'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'junit', module: 'junit'
    } '
    testRuntime 'org.junit.jupiter:junit-jupiter-api'
    testRuntime 'org.junit.jupiter:junit-jupiter-engine'
    testRuntime 'com.h2database:h2'
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

test {
    useJUnitPlatform()
}
2个回答

10

如果需要测试一个或多个有限的控制器,建议使用@WebMvcTest注解。通常情况下,@WebMvcTest只用于单个控制器,并结合@MockBean使用,为所需的协作者提供模拟实现。此外,@WebMvcTest还会自动配置MockMvc。MockMvc是一种强大的快速测试MVC控制器的方法,而无需启动完整的HTTP服务器。

如果想要在非 @WebMvcTest(如@SpringBootTest)中自动配置MockMvc,可以通过将其注释为@AutoConfigureMockMvc来实现。

参考链接


我在mainTestClass中使用了@SpringBootTest注解,这是Spring默认创建的。 但是在这个类中使用注解时,它确实无法正常工作。如果我删除该注解并将其放入每个测试类中,则可以正常工作。即使注解在mainTestClass中,它也应该能够正常工作,不是吗? - Rodrigo Batista
1
不,Spring 创建那个空的测试类只是作为占位符。它与您编写的任何新测试类都没有关联。没有隐式继承。 - Amith Kumar
我两个都有,但还是显示这个信息。 - cosmoloc

0

添加 @AutoConfigureMockMvc 以启用和配置 MockMvc 的自动配置


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接