Voir le test de simulation suivante en utilisant Spring/Spring MVCMock versus implémentation. Comment partager les deux approches dans une seule classe de test?
public class OrderTest {
// SimpleFormController
private OrderController controller;
private OrderService service;
private MockHttpServletRequest request;
@BeforeMethod
public void setUp() {
request = new MockHttpServletRequest();
request.setMethod("POST");
Integer orderNumber = 421;
Order order = new Order(orderNumber);
// Set up a Mock service
service = createMock(OrderService.class);
service.save(order);
replay(service);
controller = new OrderController();
controller.setService(service);
controller.setValidator(new OrderValidator());
request.addParameter("orderNumber", String.valueOf(orderNumber));
}
@Test
public void successSave() {
controller.handleRequest(request, new MockHttpServletResponse());
// Our OrderService has been called by our controller
verify(service);
}
@Test
public void failureSave() {
// Ops... our orderNumber is required
request.removeAllParameters();
ModelAndView mav = controller.handleRequest(request, new MockHttpServletResponse());
BindingResult bindException = (BindingResult) mav.getModel().get(BindingResult.MODEL_KEY_PREFIX + "command");
assertEquals("Our Validator has thrown one FieldError", bindException.getAllErrors(), 1);
}
}
Comme vous pouvez le voir, je fais comme proposé par Triple A pattern
- Arrangement (méthode setUp)
- Loi (contrôleur. handleRequest)
- assert (vérifier et assertEquals)
Mais je voudrais tester à la fois Mock et la classe d'implémentation (OrderService) en utilisant cette seule classe de test. Ainsi, afin de récupérer ma mise en œuvre, je re-écrire ma classe comme suit
@ContextConfiguration(locations="/app.xml")
public class OrderTest extends AbstractTestNGSpringContextTests {
}
Alors, comment dois-je écrire mon seul test à Réorganiser à la fois OrderService Mock et mise en œuvre sans changer ma méthode de test (sucessSave et failureSave)
J'utilise TestNG, mais vous pouvez montrer à JUnit si vous voulez
salutations
@Calm Storm Merci. Je sais que j'ai un test d'unité et d'intégration selon ma question. Mais il se passe que j'ai beaucoup de request.addParameter dans la méthode setUp. Pour cette raison, je voudrais utiliser à la fois les tests unitaires et d'intégration dans une seule classe de test. Mais, en suivant de bons modèles, où devrais-je mettre mon setUp methd (beaucoup de request.addParameter) ** afin de séparer dans différentes classes ** à la fois Unit et Interaction Testing ??? Pouvez-vous montrer dans le code ??? –
Cela dépend vraiment du problème. Dans votre cas, je vais avoir à la place de la ligne request.addParamter, j'aurais HelperUtil.setUpParams (request) qui va remplir certaines valeurs de commande dans la requête et ensuite vous renvoyer orderNumber. –
Merci, bon à savoir –