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