【发布时间】:2016-09-16 07:35:11
【问题描述】:
我有一个标准的 HttpServlet。当我在 tomcat 上运行它时,这适用于 autowire,我已经使用这个问题的答案完成了这个。
但我无法对其进行单元测试。它不会自动连接豆子。我知道这是因为 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