代码之家  ›  专栏  ›  技术社区  ›  Xetius

用于涉及scope=“request”bean的单元测试的easymock对象

  •  2
  • Xetius  · 技术社区  · 15 年前

    我正试图在我们的一些公司代码中添加一些单元测试。是的,我知道它应该已经存在了,但并不是每个人都像我一样对单元测试有相同的看法。

    然而,我遇到了一些阻碍。诚然,我的Java、Spring和单元测试知识并不是它们应该有的。但我的问题是:

    我在代码中添加了一个单元测试,它测试一个类。这个类包含一个具有scope=“request”的bean,当它试图实例化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 回复  |  直到 12 年前
        1
  •  0
  •   Espen    15 年前

    你需要一个 WebApplicationContext 处理豆类: scope="request"

    我建议在Spring集成测试中使用stub对象,在测试隔离类时使用easymock而不使用Spring。

        2
  •  0
  •   iwein    15 年前

    您可以在Spring上下文中使用mock:

    但这并不能解决您的问题,因为它不能使Spring理解scope=“request”。您可以创建 own implementation of the request scope 但我觉得你最好不要经历这些麻烦。

    简单的方法是在一个小的测试上下文中重写请求范围的bean。从技术上讲,你不是在测试最初的环境,但是你会做得更快。

        3
  •  0
  •   Aaron Digulla    12 年前

    弹簧3.2提供了对此的支持。见“ Spring MVC Test Framework