【问题标题】:Autowire not working in servlet when performing unit test执行单元测试时自动装配在 servlet 中不起作用
【发布时间】:2016-09-16 07:35:11
【问题描述】:

我有一个标准的 HttpServlet。当我在 tomcat 上运行它时,这适用于 autowire,我已经使用这个问题的答案完成了这个。

Autowiring in servlet

但我无法对其进行单元测试。它不会自动连接豆子。我知道这是因为 servlet 没有使用 servletConfig 初始化。但是我该怎么做呢?

Servlet 类

public class MyServlet extends HttpServlet {

  @Autowired
  private MyService myService;

  public void init(ServletConfig config) {
    super.init(config);
    SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,
      config.getServletContext());
  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response) {
      myService.doSomething();// myService is null on unit test
  }
}

测试类

@ContextConfiguration(locations = {"classpath:META-INF/spring/test-context.xml"})
@Transactional
@TransactionConfiguration(defaultRollback = true)
@TestExecutionListeners({TransactionalTestExecutionListener.class})
public class MyServletTest extends AbstractTransactionalTestNGSpringContextTests{

  private MockHttpServletRequest request;
  private MockHttpServletResponse response;
  private MyServlet myServlet;

  @Test(enabled=true)
  public void test() throws Exception {
    myServlet = new MyServlet();
    myServlet.init();
    //myServlet.init(servletConfig); //Where can i get this
    request = new MockHttpServletRequest();
    response = new MockHttpServletResponse();

    //Add stuff to request
    .
    .
    .
    myServlet.doPost(request,response); 
    //request goes through but myService throws a null pointer exception

  }
}

【问题讨论】:

  • 您是否尝试像 @Autowired private MyServlet myServlet; 这样在单元测试中将 @Autowired 注释添加到 myServlet 定义?删除myServlet = new MyServlet();
  • @DavidPérezCabrera 我按照您的指示进行操作,是的,它确实有效!!。但是我必须将@Component 添加到我的 MyServlet 类中。我不认为 Servlet 类应该用 @Component 注释。
  • @kryger 是的,可能,但我不打算让我的 servlet 类成为一个 bean。所以我通过 xml 只为测试上下文创建了这个 bean。

标签: java spring unit-testing servlets config


【解决方案1】:

将 DependencyInjectionTestExecutionListener.class 添加到您的 TestExecutionListeners。 并且不要使用“new MyServlet()”自动装配它

【讨论】:

  • 添加 DependencyInjectionTestExecutionListeners,根本没有帮助。但就像@DavidPerezCabrera 评论的那样,它适用于自动接线。有没有办法不添加@ComponentMyServlet
  • 是的。 xml配置或java配置
猜你喜欢
  • 1970-01-01
  • 2018-12-01
  • 2013-07-11
  • 1970-01-01
  • 2016-03-29
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
相关资源
最近更新 更多