48 votes

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

J'utilise les bottes 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() {

    }

}
 

99voto

Andy Wilkinson Points 2988

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

 @SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
 

21voto

avinesh Points 135

Si vous lisez la java doc de SpringBootTest annotation, il est dit que l'annotation fournit des fonctionnalités ci-dessous (pas de liste de toutes ici, mais seulement ce qui sont pertinents à la question.)

  • Fournit le support pour les différents webEnvironment modes, y compris la possibilité de démarrer un entièrement exécutant le serveur web écoute sur un définies ou de port aléatoire.
  • Enregistre un TestRestTemplate et/ou WebTestClient bean pour une utilisation dans des tests web qui sont entièrement à l'aide d'un exécutant le serveur web écoute sur un définies ou de port aléatoire.

Donc @SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT) offre la possibilité de autowire TestRestTemplate car il commence entièrement exécutant le serveur web [comme mentionné dans @AndyWilkinson réponse ainsi].

Mais si vous voulez autowire MockMvc ainsi dans la même TestClass ensuite utiliser @AutoConfigureMockMvc annotation sur TestClass.

C'est ainsi qu'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
}

6voto

Jesus Macias Points 41

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 l'annotation @Autowired dans votre classe:

 @Autowired
private TestRestTemplate restTemplate;
 

Et n'utilise pas:

 @Autowired
private MockMvc mvc;
 

Les deux ensemble ne fonctionnent pas.

3voto

Aphax Points 102

Selon la documentation de démarrage Spring :

Vous pouvez également configurer automatiquement MockMvc de manière non @WebMvcTest (par exemple SpringBootTest ) en l'annotant avec @AutoConfigureMockMvc .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X