Ошибка при внедрении MockMvc с загрузкой Spring

#spring-boot #mocking #junit5

#spring-загрузка #насмешка #junit5

Вопрос:

Я пытаюсь использовать mockmvc, но он всегда показывает ошибку:

Вызвано: org.springframework.beans.factory.Исключение NoSuchBeanDefinitionException: отсутствует соответствующий компонент типа ‘org.springframework.test.web.servlet.Доступен MockMvc: ожидается наличие как минимум 1 компонента, который квалифицируется как кандидат на автоматическое подключение. Аннотации к зависимостям: {@org.springframework.beans.factory.annotation.Автоматическое подключение (обязательно = 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()
}
  

Ответ №1:

@AutoConfigureMockMvc следует использовать с @SpringBootTest или вместо этого вы можете использовать @WebMvcTest для простой загрузки инфраструктуры Spring MVC для ограниченных контроллеров.

Часто @WebMvcTest ограничивается одним контроллером и используется в сочетании с @MockBean для предоставления макетных реализаций для необходимых сотрудников.

@WebMvcTest также автоматически настраивает MockMvc. Mock MVC предлагает мощный способ быстрого тестирования контроллеров MVC без необходимости запускать полноценный HTTP-сервер.

Вы также можете автоматически настроить MockMvc в не-@WebMvcTest (таком как @SpringBootTest), пометив его с помощью @AutoConfigureMockMvc.

Ссылка

Комментарии:

1. У меня есть аннотация @SpringBootTest в mainTestClass, которую spring создает по умолчанию. С аннотацией в этом классе это действительно не работает. Если я удалю аннотацию и добавлю в каждый тестовый класс, это сработает. Разве это не должно работать, даже если аннотация находится в mainTestClass?

2. Нет, spring создает этот пустой тестовый класс в качестве заполнителя. Это не связано ни с какими новыми тестовыми классами, которые вы пишете. Неявного наследования нет.

3. У меня есть оба, и он все еще выдает сообщение

Ответ №2:

Добавьте это @AutoConfigureMockMvc, чтобы включить и настроить автоматическую настройку MockMvc