Injecter de la maquette du Printemps MockMvc WebApplicationContext
Je suis en train de tester (via JUnit4 et le Printemps MockMvc) un service REST de l'adaptateur à l'aide de Spring-boot. La carte passe simplement le long des demandes qui lui sont faites, à un autre service REST (à l'aide d'un custom RestTemplate
) et ajoute des données supplémentaires pour les réponses.
Je voudrais MockMvc
tests à effectuer contrôleur de tests d'intégration, mais de vouloir remplacer les RestTemplate
dans le contrôleur avec un simulacre de me permettre de prédéfinir la 3ème partie RESTE de la réponse et de l'empêcher d'être frappé au cours de chaque essai. J'ai été en mesure d'accomplir par l'instanciation d'un MockMvcBuilders.standAloneSetup()
et de le transmettre au contrôleur d'être testé avec la maquette injecté énumérés dans ce post (et ma configuration ci-dessous), mais je ne suis pas capable de faire la même chose en utilisant MockMvcBuilders.webAppContextSetup()
.
J'ai été par le biais de quelques posts, aucune de répondre à la question de savoir comment cela pourrait se faire. Je voudrais utiliser le Printemps contexte de l'application pour les tests, plutôt que de autonome pour empêcher tout lacunes de l'application est susceptible de croître.
EDIT: je suis en utilisant Mockito comme se moquant de mon cadre et j'essaie d'injecter de l'un de ses simulacres dans le contexte. Si ce n'est pas nécessaire, d'autant mieux.
Contrôleur:
@RestController
@RequestMapping(Constants.REQUEST_MAPPING_PATH)
public class Controller{
@Autowired
private DataProvider dp;
@Autowired
private RestTemplate template;
@RequestMapping(value = Constants.REQUEST_MAPPING_RESOURCE, method = RequestMethod.GET)
public Response getResponse(
@RequestParam(required = true) String data,
@RequestParam(required = false, defaultValue = "80") String minScore
) throws Exception {
Response resp = new Response();
//Set the request params from the client request
Map<String, String> parameters = new HashMap<String, String>();
parameters.put(Constants.PARAM_DATA, data);
parameters.put(Constants.PARAM_FORMAT, Constants.PARAMS_FORMAT.JSON);
resp = template.getForObject(Constants.RESTDATAPROVIDER_URL, Response.class, parameters);
if(resp.getError() == null){
resp.filterScoreLessThan(new BigDecimal(minScore));
new DataHandler(dp).populateData(resp.getData());
}
return resp;
}
}
De la classe de Test:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@SpringApplicationConfiguration(classes = MainSpringBootAdapter.class)
@TestPropertySource("/application-junit.properties")
public class WacControllerTest {
private static String controllerURL = Constants.REQUEST_MAPPING_PATH + Constants.REQUEST_MAPPING_RESOURCE + compressedParams_all;
private static String compressedParams_all = "?data={data}&minScore={minScore}";
@Autowired
private WebApplicationContext wac;
private MockMvc mockMvc;
@InjectMocks
private Controller Controller;
@Mock
private RestTemplate rt;
@Value("${file}")
private String file;
@Spy
private DataProvider dp;
@Before
public void setup() throws Exception {
dp = new DataProvider(file);
MockitoAnnotations.initMocks(this);
this.mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
}
@Test
public void testGetResponse() throws Exception {
String[] strings = {"requestData", "100"};
Mockito.when(
rt.getForObject(Mockito.<String> any(), Mockito.<Class<Object>> any(), Mockito.<Map<String, ?>> any()))
.thenReturn(populateTestResponse());
mockMvc.perform(get(controllerURL, strings)
.accept(Constants.APPLICATION_JSON_UTF8))
.andDo(MockMvcResultHandlers.print());
Mockito.verify(rt, Mockito.times(1)).getForObject(Mockito.<String> any(), Mockito.<Class<?>> any(), Mockito.<Map<String, ?>> any());
}
private Response populateTestResponse() {
Response resp = new Response();
resp.setScore(new BigDecimal(100));
resp.setData("Some Data");
return resp;
}
}
OriginalL'auteur ethesx | 2015-08-04
Vous devez vous connecter pour publier un commentaire.
Du printemps
MockRestServiceServer
est exactement ce que vous cherchez.Description courte de javadoc de la classe:
Essayez de configurer votre test comme ceci:
@Configuration
inclus pour remplacer monRestTemplate
fève est également primordial de laMockRestServiceServer
bean injecté. Je vais mettre en place une autre façon sur la façon de réaliser la même chose sansMockRestServiceServer
. Donc, merci beaucoup.OriginalL'auteur mzc
Voici une autre solution. Tout simplement, il crée simplement un nouveau
RestTemplate
bean et remplace celui déjà enregistré.Ainsi, alors qu'il effectue produit les mêmes fonctionnalités que @mzc réponse, il me permet d'utiliser Mockito à la formulation de la réponse et de la vérification de rapprochement un peu plus facile.
Pas que c'est plus qu'à quelques lignes de code, mais il permet d'éviter d'avoir à ajouter du code supplémentaire pour convertir le
Response
objet d'une chaîne de caractères pour le dessus demockRestServiceServer.expect().andRespond(<String>)
de la méthode arg.Le
@Configuration
est java de configuration pour le haricot. Il est synonyme de la configuration xml. Dans ce cas, nous allons le câblage de l'autreRestTemplate
bean, mais le retour à un simulacre d'instance. En outre,@Primary
"Indique qu'un haricot préférence devra être donnée lorsque plusieurs candidats sont qualifiés pour autowire une valeur unique de la dépendance"Ok. Juste une petite avant même que j'ai essayé. Serait-ce le régime de travail sans le @ Primaire d'annotation? Ce qui est spécial au sujet de @ Primaires autres que ce que vous avez déjà dit?
Si je me souviens bien, le Printemps de la production
RestTemplate
serait utilisé à la place. Pas la maquette que vous avez besoin. Vous voudrez peut-être chercher dans@BeanMock
plus tard pour s'assurer que ce nouveau bean n'est pas découvert par le composant d'Application de la numérisation à l'extérieur de l'essaiMerci, vous avez fait ma journée. Je pense qu'il y a les choses les plus simples dans la vie que de la façon de printemps crée et combine test de contextes 🙂
OriginalL'auteur ethesx