2 votes

Objet EasyMock pour les tests unitaires impliquant un haricot scope="request".

J'essaie d'ajouter des tests unitaires à certains codes de nos entreprises. Oui, je sais que cela devrait déjà être fait, mais tout le monde ne semble pas avoir la même vision des tests unitaires que moi.

Cependant, je me suis heurté à un obstacle qui me bloque un peu. Il est vrai que mes connaissances de Java, de Spring et des tests unitaires ne sont pas aussi bonnes qu'elles le devraient. Mais mon problème est le suivant :

J'ai ajouté un test unitaire à mon code, qui teste une classe. Cette classe inclut un bean qui a scope="request", et quand elle essaie d'instancier le bean, elle lève une exception :

java.lang.IllegalStateException: No Scope registered for scope 'request'

Je pense que c'est parce que je n'ai pas d'objet HttpServletRequest, mais je ne sais pas comment créer un objet fantaisie de ce type et je ne sais pas non plus comment, une fois créé, ajouter cet objet fantaisie au test unitaire pour qu'il résolve ce problème.

Vous trouverez ci-dessous une version réduite du code concerné, qui comprend, je pense, tous les détails qui font partie de ce problème.

Comment faire pour que ça marche ?

@Test
public void handleRequest() {
    try {
        Message<?> outMessage = (Message<?>) response.handleRequest(map);
    } catch (Exception e) {
        assertNotNull(e);
    }
    outMessage.getPayload().toString());
}

public class upddResponse extends AbstractResponseTransform {

@SuppressWarnings("unchecked")
public Message<?> handleRequest(Map<String, Message<?>> messages) throws Exception {
    super.addEnvironmentDetails(serviceResponseDocument.getServiceResponse());
}

public abstract class AbstractResponseTransform implements ResponseTransform,
            ApplicationContextAware {

    private ApplicationContext applicationContext;
    private MCSResponseAggregator mcsResponseAggregator;

    public ServiceResponseType addEnvironmentDetails(ServiceResponseType serviceResponse) throws Exception {
        try {
            mcsResponseAggregator = (MCSResponseAggregator) applicationContext
                        .getBean("mcsResponseAggregator");
        }
        catch (Exception ex) {

        }
    }
}

public interface ResponseTransform extends Transform {
    public Message<?> handleRequest(Map<String, Message<?>> messages)
            throws Exception;
}

<bean id="mcsResponseAggregator" class="com.company.aggregator.MCSResponseAggregator" scope="request" />

0voto

Espen Points 5898

Vous avez besoin d'un WebApplicationContext pour manipuler les haricots : scope="request"

Je recommande d'utiliser les objets stub avec les tests d'intégration de Spring et d'utiliser EasyMock sans Spring lorsque vous testez une classe isolée.

0voto

iwein Points 4957

Vous pouvez utiliser les mocks au sein de Spring C

mais cela ne résoudra pas votre problème car Spring ne comprendra pas scope="request". Vous pouvez créer votre sa propre mise en œuvre de la portée de la demande mais j'ai l'impression que vous feriez mieux de ne pas vous donner tout ce mal.

La solution la plus simple serait de remplacer votre haricot à portée de requête dans un petit contexte de test. Techniquement, vous ne testez pas le contexte original, mais vous aurez terminé beaucoup plus rapidement.

0voto

Aaron Digulla Points 143830

Spring 3.2 est livré avec un support pour cela. Voir " Cadre de test Spring MVC "

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X