Avec une application Web Spring Boot + Thymeleaf (elle est presque identique à l'arborescence de code "initiale" gs-consumer-rest du projet Spring ):
├── pom.xml
└── src
├── main
│ ├── Java
│ │ └── hello
│ │ ├── Application.Java
│ │ ├── Config.Java
│ │ └── Controller.Java
│ └── resources
│ └── templates
│ └── index.html
└── test
└── Java
└── hello
└── ControllerTest.Java
... l'utilisateur est très bien accueilli par "Hello World!" à http://localhost:8080/
, mais le câblage du "contexte" de Spring ne semble pas s'appliquer dans le test d'intégration (ControllerTest.Java
):
Java.lang.AssertionError: Status
Expected :200
Actual :404
Qu'est-ce qui ne va pas avec disposition du projetet/ou annotations de configurationdans le test)?
src/main/webapp/
est intentionnellement manquant, avec des éléments tels que web.xml
et WEB-INF/
. Le but ici est d'utiliser une configuration minimale, avec un test d'intégration pour tester le développement de la vue et du contrôleur de l'application.
Détails Gory ci-dessous. Désolé d'avance pour le "mur de texte".
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.1.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
package hello;
// ...
@SpringBootApplication
public class Application {
public static void main(String[] args) throws Throwable {
SpringApplication.run(Application.class, args);
}
}
package hello;
@org.springframework.stereotype.Controller
public class Controller {
}
package hello;
// ...
@Configuration
public class Config extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
}
}
package hello;
// ...
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = Config.class)
public class ControllerTest {
@Autowired
private WebApplicationContext wac;
private MockMvc mockMvc;
@Before
public void setup() {
mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
}
@Test
public void test() throws Exception {
this.mockMvc
.perform(get("/"))
.andExpect(status().isOk());
}
}
<!DOCTYPE html>
<html>
<head>
<title>Hello World!</title>
</head>
<body>
<p>Hello world!</p>
</body>
</html>
Merci à @ M.Deinum de m'aider à réaliser que:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = Config.class)
public class ControllerTest {
...devrait être:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@SpringApplicationConfiguration(classes = Application.class)
public class ControllerTest {
Je suppose que @ContextConfiguration
est destiné aux tests d'intégration dans Spring , alors que @SpringApplicationConfiguration
est destiné aux tests d'intégration à Spring Boot .
Selon le Javadoc pour ce dernier :
Annotation au niveau classe utilisée pour déterminer comment charger et configurer un ApplicationContext pour les tests d'intégration.
Similaire à la @ContextConfiguration standard, mais utilisant SpringApplicationContextLoader de Spring Boot.
package com.test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import netgloo.Application;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public class SmokeTest {
@Test
public void contexLoads() throws Exception {
System.out.println("Test");
}
}