spring MVC mock类单元测试(controller)

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接口。

1AbstractSpringContextTests

[1],该类全部方法是protected的,主要用于子类重写。 

2AbstractDependencyInjectionSpringContextTests

[2]:继承于类[1]:名字N长的。如果仅仅使用Spring依赖注入功能,可以让测试用例继承该类。 

3AbstractTransactionalSpringContextTests

[3]:继承于类[2],继承该类的测试用例在spring管理的事务中进行,测试完后对数据库的记录不会造成任何影响。 

4AbstractTransactionalDataSourceSpringContextTests

:继承于类[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() );}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值