`
ginge
  • 浏览: 208404 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

jmockit 的使用示例-10另一种基于状态的Mock,随穿随脱?

 
阅读更多

目标测试代码

package jmockit.target;

public class Constructor {

	private String memberId;

	public Constructor(String memberId) {
		this.memberId = memberId;
	}

	public String getRealName() {
		return "real_" + this.memberId;
	}

}

 

Mock代码
package jmockit.sample;

import jmockit.target.Constructor;
import junit.framework.Assert;
import mockit.Mock;
import mockit.Mocked;
import mockit.Mockit;

import org.junit.Test;

/**
 * 除了使用@MockUp的另外一种基于状态的mock测试的方式。
 * 
 * @author Ginge
 * 
 */
public class ConstructorTest2 {
	@Mocked
	private Constructor constructor = null;

	@Test
	public void mockConstructor() {

		// 可以在任意时候把Mock装置起来,不用的时候可以脱下来
		Mockit.setUpMock(Constructor.class, new MockedConstructor());

		// 触发构造方法的mock
		new Constructor("Constructor");
		Assert.assertEquals("mock_Constructor", constructor.getRealName());

		// 注意咯,擦亮眼睛了,现在开始脱了
		Mockit.tearDownMocks(Constructor.class);

		constructor = new Constructor("Constructor");
		// 看到了吧,看到真容了
		Assert.assertEquals("real_Constructor", constructor.getRealName());

	}

	/**
	 * MockedConstructor相当于一个标志,具体名称不重要,重要的要它里面被@Mock注解的方法。如果有方法被注解了@Mock,
	 * 并且恰好方法的签名又和Mockit.setUpMock中声明的类型中的某个方法一样,那么对应的方法就被Mock
	 * 为了方便才把这个类的声明放到ConstructorTest2里面的,其实这个类可以放到任何地方
	 * 
	 * @author Ginge
	 * 
	 */
	public static class MockedConstructor {

		private String memberId;

		@Mock
		public void $init(String memberId) {
			this.memberId = "mock_" + memberId;
		}

		@Mock
		public String getRealName() {
			return this.memberId;
		}
	}

}
 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics