test perform mvc example spring-mvc spring-boot spring-test

spring mvc - perform - la prueba de arranque de primavera no puede inyectar TestRestTemplate y MockMvc



spring rest junit mockito (4)

Estoy usando el arranque de primavera 1.4.0.RELEASE . Estoy escribiendo pruebas para mi clase de controlador. Obtengo la siguiente excepción.

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ''com.concur.cognos.authentication.service.ServiceControllerITTest'': Unsatisfied dependency expressed through field ''restTemplate'': No qualifying bean of type [org.springframework.boot.test.web.client.TestRestTemplate] found for dependency [org.springframework.boot.test.web.client.TestRestTemplate]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.boot.test.web.client.TestRestTemplate] found for dependency [org.springframework.boot.test.web.client.TestRestTemplate]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

Aquí está mi clase de prueba

public class ServiceControllerITTest extends ApplicationTests { @Autowired private TestRestTemplate restTemplate; @Autowired private MockMvc mvc; @Test public void exampleTest() throws Exception { // test } }

ApplicationTests.java

@RunWith(SpringRunner.class) @SpringBootTest @WebAppConfiguration //@DirtiesContext public class ApplicationTests { @Autowired Environment env; @Test public void contextLoads() { } }


De acuerdo con la documentación de arranque de Spring :

También puede autoconfigurar MockMvc en un @WebMvcTest no sea de @WebMvcTest (por ejemplo, SpringBootTest ) @AutoConfigureMockMvc con @AutoConfigureMockMvc .


Para trabajar con eso, no use TestRestTemplate en desuso.

Obsoleto:

import org.springframework.boot.test.TestRestTemplate;

Correcto:

import org.springframework.boot.test.web.client.TestRestTemplate;

Entonces puedes usar la anotación @Autowired en tu clase:

@Autowired private TestRestTemplate restTemplate;

Y no uses:

@Autowired private MockMvc mvc;

Ambos juntos no funcionan.


Si lee el documento java de la anotación SpringBootTest, dice que la anotación proporciona las funciones a continuación (no enumerando todas aquí, sino solo las relevantes para la pregunta).

  • Brinda soporte para diferentes modos de entorno web, incluida la capacidad de iniciar un servidor web completamente en ejecución que escucha en un puerto definido o aleatorio.
  • Registra un bean TestRestTemplate y / o WebTestClient para su uso en pruebas web que utilizan un servidor web completamente en ejecución que escucha en un puerto definido o aleatorio.

Así que @SpringBootTest (webEnvironment = WebEnvironment.RANDOM_PORT) proporciona la posibilidad de autocablear TestRestTemplate porque inicia un servidor web en pleno funcionamiento [como se menciona en la respuesta de @AndyWilkinson ''].

Pero si también quiere autoconfigurar MockMvc en el mismo TestClass, entonces use la anotación @AutoConfigureMockMvc sobre TestClass.

Así es como se ve una clase de prueba:

@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT) @AutoConfigureMockMvc public class SBTest { @Autowired private TestRestTemplate restTemplate; @Autowired private MockMvc mvc; // tests }


TestRestTemplate solo se configura automáticamente cuando @SpringBootTest se ha configurado con un webEnvironment que significa que inicia el contenedor web y escucha las solicitudes HTTP. Por ejemplo:

@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)