web-dev-qa-db-fra.com

test de démarrage à ressort incapable d’injecter TestRestTemplate et MockMvc

J'utilise botte de printemps 1.4.0.RELEASE. J'écris des tests pour ma classe de contrôleur. Je reçois l'exception suivante.

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)}

Voici ma classe de test

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() {

    }

}
37
brain storm

TestRestTemplate n'est configuré automatiquement que lorsque @SpringBootTest a été configuré avec un webEnvironment, ce qui signifie qu'il démarre le conteneur Web et écoute les demandes HTTP. Par exemple:

@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
71
Andy Wilkinson

Si vous lisez la doc Java doc de l'annotation SpringBootTest, elle indique que l'annotation fournit des fonctionnalités ci-dessous (ne les répertorie pas toutes ici, mais uniquement celles qui sont pertinentes pour la question.)

  • Fournit la prise en charge de différents modes webEnvironment, notamment la possibilité de démarrer un serveur Web entièrement opérationnel en écoutant sur un port défini ou aléatoire.
  • Enregistre un bean TestRestTemplate et/ou WebTestClient à utiliser dans les tests Web utilisant un serveur Web entièrement opérationnel, à l'écoute sur un port défini ou aléatoire.

Ainsi, @SpringBootTest (webEnvironment = WebEnvironment.RANDOM_PORT) offre la possibilité d'autowire TestRestTemplate car il démarre un serveur Web complètement exécuté [comme mentionné dans la réponse de @AndyWilkinson].

Mais si vous souhaitez également connecter automatiquement MockMvc dans la même TestClass, utilisez l'annotation @AutoConfigureMockMvc sur TestClass.

Voici à quoi une classe de test peut ressembler:

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

    @Autowired
    private MockMvc mvc;

   // tests
}
6
avinesh

Pour travailler avec cela, n'utilisez pas un TestRestTemplate obsolète.

Obsolète

import org.springframework.boot.test.TestRestTemplate;

Correct:

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

Ensuite, vous pouvez utiliser le @Autowired annotation dans votre classe:

@Autowired
private TestRestTemplate restTemplate;

Et n'utilisez pas:

@Autowired
private MockMvc mvc;

Les deux ensemble ne fonctionnent pas.

5
Jesus Macias

Selon documentation de démarrage Spring :

Vous pouvez également configurer automatiquement MockMvc dans un environnement non -@WebMvcTest _ (par exemple SpringBootTest) en l’annotant avec @AutoConfigureMockMvc.

2
Aphax