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() {
}
}
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)
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.
Selon documentation de la botte de printemps:
vous pouvez aussi auto-configurer MockMvc
non@WebMvcTest
(e.g. SpringBootTest
) en annotant avec @AutoConfigureMockMvc
.
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
}