Spring从J2EE的Web端为每个关键接口提供了一个mock实现:
MockHttpServletRequest
几乎每个单元测试中都要使用这个类,它是J2EE Web应用程序最常用的接口HttpServletRequest的mock实现。
MockHttpServletResponse
此对象用于HttpServletResponse接口的mock实现。
MockHttpSession
这是另外一个经常使用的mock对象(后文将讨论此类在会话绑定处理中的应用)。
DelegatingServletInputStream
这个对象用于ServletInputStream接口的mock实现。
DelegatingServletOutputStream
这个对象将代理ServletOutputStream实现。在需要拦截和分析写向一个输出流的内容时,你可以使用它。
MockExpressionEvaluator
这个mock对象主要应用于你想开发并测试你自己的基于JSTL的标签库时。
MockFilterConfig
这是FilterConfig接口的一个mock实现。
MockPageContext
这是JSP PageContext接口的一个mock实现。你会发现这个对象的使用有利于测试预编译的JSP。
MockRequestDispatcher
RequestDispatcher接口的一个mock实现,你主要在其它mock对象内使用它。
MockServletConfig
这是ServletConfig接口的一个mock实 现。在单元测试某种Web组件(例如Struts框架所提供的Web组件)时,要求你设置由MockServletContext所实现的 ServletConfig和ServletContext接口。
1、AbstractSpringContextTests
类[1],该类全部方法是protected的,主要用于子类重写。
2、AbstractDependencyInjectionSpringContextTests
类[2]:继承于类[1]:名字N长的。如果仅仅使用Spring依赖注入功能,可以让测试用例继承该类。
3、AbstractTransactionalSpringContextTests
类[3]:继承于类[2],继承该类的测试用例在spring管理的事务中进行,测试完后对数据库的记录不会造成任何影响。
4、AbstractTransactionalDataSourceSpringContextTests
:继承于类[3],功能更强大,用于测试持久层组件,看其源代码,有一行"protected JdbcTemplate jdbcTemplate;",提供了一个JdbcTemplate的变量,通过该对象可以直接操作数据库。
示例1:
public void final testGettingToDetails throws Exception{
MyController myController = new MyController();
myController.setDetailsView( detailsViewName );
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
request.setMethod("POST");
request.addParameter("viewDetails", "true");
ModelAndView modelAndView = myController.handleRequest(request, response);
assertEquals("Incorrect view name", detailsViewName,modelAndView.getViewName());
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@RunWith(SpringJUnit4ClassRunner.class)
这里需要讲的是,junit利用了这个run class之后就不能再用,parameters那个class了
@ContextConfiguration(locations={ "applicationContext.xml", "mvc-servlet.xml" })
这里需要注意的是配置文件application中bean注入,可能调用jdbc.properties文件,用junit是调用不通的,你得把文件都写到applicationcontex中,
比如说value="$jdbc.username",就要写成value=username。类似的
private MockHttpServletRequest request;
private MockHttpServletResponse response;
使用autowired将自己新建的类注入spring
@Autowired
private XXXX xxxx;
在before中定义request和一些其他的的属性,
@Before
public void setUp() throws Exception {
request = new MockHttpServletRequest();
request.setCharacterEncoding("UTF-8");
利用contextholder将被测试文件的request锁定到测试文件mock的request
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));
response = new MockHttpServletResponse();
}
最后如果文件含有既定的exception,使用trycatch保持一致就行
示例2:session
public void testInvokesCorrectMethodWithSession() throws Exception {
TestController cont = new TestController();
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/invoiceView.app");
request.setSession(new MockHttpSession(null));
HttpServletResponse response = new MockHttpServletResponse();
ModelAndView mv = cont.handleRequest(request, response);
assertTrue("Invoked loggedIn method", cont.wasInvoked("loggedIn"));
assertTrue("view name is ",mv.getViewName().equals("loggedIn"));
assertTrue("Only one method invoked", cont.getInvokedMethods() == 1);//测试控制器但是不使用会话
request = new MockHttpServletRequest("GET", "/invoiceView.app");
response = new MockHttpServletResponse();
try {
cont.handleRequest(request, response);
fail("Should have rejected request without session");
} catch (ServletException ex) {//在此加入期盼的异常处理}}
示例3:重定向
String responseString = ((MockHttpServletResponse)httpResponse).getForwardedUrl();
assertEquals( "Did not forward to the expected URL", responseString, expectedString);
示例4:正确的二进制输出
public void testPDFGeneration() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
viewInvoiceAsPDFController.handleRequest( request, response );
byte[] responsePDFValues = response.getContentAsByteArray();
byte[] expectedPDFValues = loadBytesFromTestFile();
assertTrue( "Did not generate expected PDF content.", Arrays.equals(responsePDFValues,expectedPDFValues ));
}
示例5:创建mock组件
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
public class MyTransactualControllerTest extends AbstractTransactionalSpringContextTests {
public class.
protected abstract String[] getConfigLocations(){ return new String[] {"classpath:/test/spring-context.xml"};}
public MyTransactualController myTransactualController;
public MyTransactualController getMyTransactualController()
{
return this.myTransactualController;
}
public void setMyTransactualController( MyTransactualController myTransactualController) { this.myTransactualController = myTransactualController;
}
public void testCorrectBehavior() throws Exception{ //运行该事务性方法
myTransactualController.submitPayment( new Payment( 100 ) );
assertTrue( myTransactualController.isValid() );}