如何JUnit4-测试Spring的模拟请求中的el-Expressions?

时间:2014-07-17 15:59:16

标签: java spring junit4 easymock

这就是我所拥有的,但Assert总是抛出AssertionException:

@Configuration
public class Config
  @Bean
  public HttpServletRequest request(){
     HttpServleRequest mock = EasyMock.createMock(HttpServletRequest.class);
     EasyMock.expect(mock.getParameter("test")).andReturn("123").anyTimes();
     EasyMock.replay(mock);
     return mock;
  }

  @Bean
  MySerivce service(){
    return new MyService();
  }

  @Bean
  public ApplicationContextProvider context(){
    return new ApplicationContextProvider();
  }
}

这是服务MyService.java

public class MyService{
  public void assertHasRequest(@Value("#{request}") HttpServletRequest request)){
    assert request != null;
  }
}

测试:TestExpressions.java

@RunWith(SpringJUnit4ClasssRunner.class)
@ContextConfiguration(classes=Config.class)
public class TestExpressions {

  @Autowired
  MyService service;

  @Test
  public void testService(){
    service.assertHasRequest(null);
  }
}

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我担心你不能直接在方法参数上使用@Value注释,以便在提供null时能够用默认值替换参数。

在您的情况下,@Value注释与AutowiredAnnotationBeanPostProcessor一起使用,并且此处理器不监视方法参数级别上的@Value注释。

您可以将@Value置于方法级别,这将使Spring从上下文中注入HttpServletRequest bean,但不会在每个请求中执行此操作:

public class MyService {

    private HttpServletRequest request;

    @Value("#{request}")
    public void assertHasRequest(HttpServletRequest request) {
        if (request != null) {
            this.request = request;
        }
        assert this.request != null;
    }

}

配置类:

@Configuration
public class Config {

    @Bean
    public HttpServletRequest request() {
        HttpServletRequest mock = EasyMock.createMock(HttpServletRequest.class);
        EasyMock.expect(mock.getParameter("test")).andReturn("123").anyTimes();
        EasyMock.replay(mock);
        return mock;
    }

    @Bean
    MyService service() {
        return new MyService();
    }

}

测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=Config.class)
public class TestExpressions {

    @Autowired
    MyService service;

    @Test
    public void testService(){
        service.assertHasRequest(null);
    }
}

在Spring MVC控制器中使用@Value的行为会有所不同。

答案 1 :(得分:0)

@Value并不意味着像这样使用。其主要目的是提供一种在自动装配发生时为注入字段指定默认值的方法。这一点很重要,因为您似乎希望在从代码中调用方法时使用@Value,而当您调用该方法时,自动装配已经发生,并且您无法使用{{更改任何已经自动装配的字段1}}。 @Value在实例创建时使用一次。

使用@Value处理您需要的内容的最简单方法是:

@Value

在上面的代码中,当Spring创建public class MyService { @Value("#{request}") private HttpServletRequest request; public void assertHasRequest() {// no parameters here because they don't act on local field this.request assertNotNull(this.request); } } 类中指定的MyService实例时,它将检测Config的使用以及何时创建@Value(在您到达之前的方式)调用MyService)它将注入它找到的assertHasRequest()实例。

让我再举一个例子:

request

在此代码中,public class MyService { private HttpServletRequest request; public void assertHasRequest() { assertNotNull(this.request); } @Value("#{request}") private void initialize(HttpServletRequest request) { System.out.println("initializing request"); this.request = request; } } 放置在方法@Value上。创建initialize()实例时,Spring容器会自动调用此方法,一次。这就像一个初始化方法,目的是设置字段MyService。如果需要,您可以从代码中调用该方法,但它不起作用。 request有意义让Spring知道在创建bean实例后要做什么。

对于放置在方法或构造函数的参数上的@Value,需要使用@Value

@Autowired