test de la botte de printemps impossible d'injecter TestRestTemplate et MockMvc

je suis à l'aide de spring boot 1.4.0.RELEASE. J'écris des tests pour mon cours de controller. J'obtiens 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 mon cours 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() {

    }

}
28
demandé sur brain storm 2016-08-29 22:14:24

4 réponses

TestRestTemplate est seulement Auto-configuré quand @SpringBootTest a été configuré avec un webEnvironment cela signifie qu'il démarre le conteneur web et écoute les requêtes HTTP. Par exemple:

@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
52
répondu Andy Wilkinson 2016-08-29 21:07:34

pour travailler avec cela, n'utilisez pas un TestRestTemplate déprécié.

Obsolète:

import org.springframework.boot.test.TestRestTemplate;

Correct:

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

alors vous pouvez utiliser le @Autowired annotation dans votre classe:

@Autowired
private TestRestTemplate restTemplate;

Et ne pas utiliser:

@Autowired
private MockMvc mvc;

les Deux ensemble ne fonctionne pas.

4
répondu Jesus Macias 2017-02-15 14:10:41

Selon documentation de la botte de printemps:

vous pouvez aussi auto-configurer MockMvc non@WebMvcTest(e.g. SpringBootTest) en annotant avec @AutoConfigureMockMvc.

1
répondu Aphax 2017-03-24 09:18:41

si vous lisez l'annotation java doc of SpringBootTest, il est dit que l'annotation fournit les fonctionnalités ci-dessous (ne pas les énumérer toutes ici, mais seulement ce qui est pertinent à la question.)

  • fournit la prise en charge de différents modes d'environnement web, y compris la possibilité de démarrer une écoute de serveur web entièrement en cours d'exécution sur un port défini ou aléatoire.
  • enregistre un test TestRestTemplate et/ou webtestclient bean pour utilisation dans les tests web qui utilisent un serveur web entièrement en cours d'exécution écoute sur un port défini ou aléatoire.

So @SpringBootTest (webenvironnement=Webenvironnement.RANDOM_PORT) fournit la possibilité d'autowire TestRestTemplate parce qu'il démarre un serveur web entièrement fonctionnel [comme mentionné dans la réponse de @AndyWilkinson].

mais si vous voulez autowire MockMvc aussi bien dans la même classe de test alors utiliser @ AutoConfigureMockMvc annotation over TestClass.

voici à quoi ressemble une classe Test:

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

    @Autowired
    private MockMvc mvc;

   // tests
}
1
répondu avinesh 2018-07-11 09:52:10