java unit test Mock框架jMockit示例教程 - 动态部分mock,mockjmockit,动态Mock示例,如果在
分享于 点击 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)); } }
用户点评