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)