Объект EasyMock для модульного тестирования с использованием компонента scope = "request" - PullRequest
2 голосов
/ 21 июня 2010

Я пытаюсь добавить модульное тестирование в код некоторых наших компаний. Да, я знаю, что он уже должен быть там, но не у всех, похоже, такое же представление о модульном тестировании, как у меня.

Однако я выступил против некоторой пробки для меня. По общему признанию, мои знания Java, Spring и Unit Testing - это не все, чем они должны быть. Моя проблема заключается в следующем:

Я добавил модульный тест в мой код, который проверяет класс. Этот класс включает в себя bean-компонент, который имеет scope = "request", и когда он пытается создать экземпляр bean-компонента, он генерирует исключение:

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

Я полагаю, что это потому, что у меня нет объекта HttpServletRequest, но я не знаю, как создать имитацию одного из них, а также я не знаю, как после создания добавить этот фиктивный объект в модульный тест, чтобы решить эту проблему.

Ниже приведена сокращенная версия кода, который, как мне кажется, включает в себя все детали, которые являются частью этой проблемы.

Как мне заставить это работать?

@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" />

Ответы [ 3 ]

0 голосов
/ 21 июня 2010

Вы можете использовать макеты в контексте Spring:

но это не решит вашу проблему, так как это не заставит Spring понять область действия = "запрос". Вы можете создать свою собственную реализацию области запроса , но у меня возникает ощущение, что вам лучше не переживать все эти проблемы.

Самый простой выход - переопределить bean-объект области действия запроса в небольшом тестовом контексте. Технически вы тогда не тестируете исходный контекст, но все будет сделано быстрее.

0 голосов
/ 05 февраля 2013

Spring 3.2 поставляется с поддержкой этого.См. « Spring MVC Test Framework »

0 голосов
/ 21 июня 2010

Вам нужно WebApplicationContext для обработки бобов: scope="request"

Я рекомендую использовать объекты-заглушки с тестами интеграции Spring и использовать EasyMock без Spring при тестировании изолированного класса.

...