[单元测试]jmockit+SpringMVC整合并测试Controller层方法(三)

来源:互联网 发布:软件系统发布流程 编辑:程序博客网 时间:2024/06/06 02:55
  jmockit 解决powermockito内存溢出问题
  之前用powermockito成功解决静态方法mock问题,单个测试类运行看似一切正常,当项目所有的单元测试方法一起跑的时候,就呵呵啦(内存溢出.....)。试着通过扩大jdk内存,仍然无法解决。
  后来bai度各种尝试,发现jmockit可以解决内存溢出问题。关于jmokit更详细的博客,可以搜到一堆,这里只做最简单的测试案例,以作备忘。

1.maven引入jmockit

<!-- jmockit --><dependency> <groupId>org.jmockit</groupId> <artifactId>jmockit</artifactId> <version>1.32</version> <scope>test</scope></dependency><!-- jmockit -->

说明: jmockit需在放在junit上面,防止出现异常。

2.BaseJunit4 基类的配置

import static org.junit.Assert.assertEquals;import mockit.Mocked;import org.junit.Test;import org.junit.runner.RunWith;import org.slf4j.Logger;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import org.springframework.test.context.transaction.TransactionConfiguration;import org.springframework.transaction.annotation.Transactional;@RunWith(SpringJUnit4ClassRunner.class)  //使用junit4进行测试@ContextConfiguration (locations={"classpath:/context-biz-test.xml","classpath:META-INF/app_config/context/context-shiro.xml"}) //加载配置文件@Transactional@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)public class BaseJunit4 {public static final Logger logger = LoggerFactory.getLogger();@Mocked public UserUtils userUtils;@Testpublic void test(){  assertEquals(1, 1);}}
说明:@Mocked:mock静态类,之后录制方法预期行为时,可以直接使用。

3.单元测试方法案例:

public class AssetScrapHandleControllerTest extends BaseJunit4 {@Resourceprivate static AssetScrapHandleController controller;@Resource(name=IAssetScrapHandleAction.ACTION_ID)private IAssetScrapHandleAction aSHAction;@Beforepublic void befor(){//依赖注入相应的actionReflectionTestUtils.setField(controller, "assetScrapHandleAction", aSHAction);}@Testpublic void testAssetScrapHandleList() {Map map = new HashMap();                //录制mock方法的预期行为new Expectations() {{OrganizationBO bo = new  OrganizationBO();bo.setLeavel("L0");userUtils.getLoginUserCom();  //当执行getLoginUserCom()方法时result=bo;                    //返回预定义结果bo}{UserBO userbo = new UserBO();userbo.setOrgCode("RS1100");LoginUser loginUser = new LoginUser(userbo);userUtils.getUser();result=loginUser;}};//模拟请求 MockHttpServletRequest request = new MockHttpServletRequest();request.setParameter("orgCode", "RS1100");CurrentPage page = new CurrentPage();map = controller.getAssetScrapHandleList(request, page); boolean actual = true;    assertEquals(Integer.valueOf(map.get("total").toString())>=1, actual); }}
说明:如果一个方法中,存在两个需要mock的静态方法,只需要使用{}括号,分隔开来就可以。






阅读全文
0 0
原创粉丝点击