有时候,有些编写不良好的类的构造函数,初始代码块,静态代码块存在大量的初始化逻辑,初始化会报错。

比如,有些类初始化的时候就去连结DB,连不上就报错。这很影响我们的测试程序的运行。

此时,我们需要把这些初始化逻辑Mock掉。用我们的Mock逻辑替代。要Mock这些初始化代码,很简单。见如下的例子:

//一个包含初始代码块的普通类 
public class AnOrdinaryClassWithBlock {
	private int i;

	public static int j;

	// 初始代码块
	{
		i = 1;
	}
	// 静态初始代码块
	static {
		j = 2;
	}

	// 构造函数
	public AnOrdinaryClassWithBlock(int i) {
		this.i = i;
	}
 
	public int getI() {
		return i;
	}

	public void setI(int i) {
		this.i = i;
	}

}


//Mock构造函数&初始代码块
public class ConstructorAndBlockMockingTest {
	// AnOrdinaryClassWithBlock的MockUp类,继承MockUp即可
	public static class AnOrdinaryClassWithBlockMockUp extends MockUp<AnOrdinaryClassWithBlock> {
		// Mock构造函数和初始代码块, 函数名$init就代表类的构造函数
		@Mock
		public void $init(int i) {
		}

		// Mock静态初始代码块,, 函数名$init就代表类的静态代码块
		@Mock
		public void $clinit() {
		}
	}

	@Test
	public void testClassMockingByMockUp() {
		new AnOrdinaryClassWithBlockMockUp();
		AnOrdinaryClassWithBlock instance = new AnOrdinaryClassWithBlock(10);
		// 静态初始代码块被mock了
		Assert.assertTrue(AnOrdinaryClassWithBlock.j == 0);
		// 构造函数和初始代码块被mock
		Assert.assertTrue(instance.getI() == 0);
	}

}