欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

java unit test Mock框架jMockit示例教程 - 动态部分mock,mockjmockit,动态Mock示例,如果在

来源: javaer 分享于  点击 24852 次 点评:288

java unit test Mock框架jMockit示例教程 - 动态部分mock,mockjmockit,动态Mock示例,如果在


动态Mock示例,如果在录制阶段new Expectations不传入任何参数,那么声明为mock的类型的所有方法将会被mock。这种静态的mock非常局限 ,有时我们需要的是有条件的mock,在一定条件下mock才生效,在一定条件下却需要调用实际的方法。这时候我们就需要动态的mock。 如果传入的是一个类, 那么该类型的所有方法但不包括父类的方法都会被mock。如果传入的是一个实例, 那么该类型的所有方法并包括父类的方法都会被mock。

package cn.outofmemory.jmockit.sample;  import jmockit.target.OfferPostAction;  import jmockit.target.WinportUrlServiceImpl;  import junit.framework.Assert;  import mockit.Expectations;  import mockit.Mocked;  import org.junit.Test;  /**  * 动态Mock示例,如果在录制阶段new  * Expectations不传入任何参数,那么声明为mock的类型的所有方法将会被mock。这种静态的mock非常局限  * ,有时我们需要的是有条件的mock,在一定条件下mock才生效,在一定条件下却需要调用实际的方法。这时候我们就需要动态的mock。 <li>  * 如果传入的是一个类, 那么该类型的所有方法但不包括父类的方法都会被mock。</li> <li>如果传入的是一个实例,  * 那么该类型的所有方法并包括父类的方法都会被mock。</li>  *   * @author Ginge  *   */  public class DynamicPartialMocking {      @Mocked      private WinportUrlServiceImpl winportUrlService = null;      private OfferPostAction offerPostAction = new OfferPostAction();      private final String memberId = "test2009";      @Test      public void dynamicallyMockAClass() {          new Expectations(WinportUrlServiceImpl.class) {              {                  // 期望被mock的调用,以及被调用时返回的结果                  winportUrlService.hasWinport(memberId);                  result = false; // 也可以是returns(false);                  // 总共可以调用的次数                  times = 1;                  winportUrlService.getPostedOfferCounts(memberId);                  returns(999l);                  times = 1;              }          };          // 因此xxx没有匹配到test2009,因此下面的调用中没有被mock          Assert.assertEquals(true, offerPostAction.hasWinport("xxxx"));          // 因为Expectation中声明只有一次mock,因此第一次的结果返回将是false          Assert.assertEquals(false, offerPostAction.hasWinport(memberId));          // 因为Expectation中声明只有一次mock,因此第二次的结果返回将是true          Assert.assertEquals(true, offerPostAction.hasWinport(memberId));          Assert.assertEquals(999l, offerPostAction                  .getPostedOfferCounts(memberId));          // Expectations中参数是类的时候,只能mock当前类的方法,而不能mock父类的方法,因此以下的assert语句将会失败  //      Assert.assertEquals(1000l,offerPostAction.getPostedOfferCounts(memberId  //       ));      }      @Test      public void dynamicallyMockAnInstance() {          new Expectations(new WinportUrlServiceImpl()) {              {                  // 期望被mock的调用,以及被调用时返回的结果                  winportUrlService.hasWinport(memberId);                  result = false; // 也可以是returns(false);                  // 总共可以调用的次数                  times = 1;                  winportUrlService.getPostedOfferCounts(memberId);                  returns(999l);                  times = 1;              }          };          // 因为Expectation中声明只有一次mock,因此第一次的结果返回将是false          Assert.assertEquals(false, offerPostAction.hasWinport(memberId));          // 因为Expectation中声明只有一次mock,因此第二次的结果返回将是true          Assert.assertEquals(true, offerPostAction.hasWinport(memberId));          // 因为Expectation中的参数是对象,因此整个继承树上的方法,除了java.lang.Object上的方法,都可以mock          Assert.assertEquals(999l, offerPostAction                  .getPostedOfferCounts(memberId));          Assert.assertEquals(1000l, offerPostAction                  .getPostedOfferCounts(memberId));      }  }  
相关栏目:

用户点评