読者です 読者をやめる 読者になる 読者になる

ほわいとぼーど

ぷろぐらまのメモ帳

jmockitでMockクラス

jmockit,testNG

こんな感じのクラスがあって、

public class Sample {
	
	public boolean execute(PrintWriter writer) {
		writer.println("start executing.");
		
		boolean success = new SampleMock().doSomething();
		writer.println(success ? "execute successfully." : "failed to execute.");

		return success;
	}
}

PrintWriterの部分をモックにするのに、色んなところで使うのでソレ用のクラスを作るとする。

@MockClass(realClass=PrintWriter.class)
public class MockPrintWriter {
	private static List<String> messages = new ArrayList<String>();
	@Mock
	public void println(String message) {
		messages.add(message);
		System.out.println(message);
	}

	public static String getMessage(int index) {
		int size = messages.size();
		return messages.get(size - index);
	}
}

こんな感じで設定された内容が取れるように。

テスト側は、

public class SampleTest {
	
	@BeforeMethod
	public void beforeMethod() {
		Mockit.setUpMock(MockPrintWriter.class);
	}
	
	@AfterMethod
	public void afterMethod() {
		Mockit.tearDownMocks();
	}
	
	@Test
	public void execute() {
		new NonStrictExpectations() {
			SampleMock sampleMock;
			{
				sampleMock.doSomething(); result = true;
			}
		};
		
		Sample sut = new Sample();
		boolean actual = sut.execute(new PrintWriter(System.out));
		
		assertTrue(actual);
		assertEquals(MockPrintWriter.getMessage(1), "execute successfully.");
	}
}

JUnitじゃなくてTestNGなのはアレな都合。


これを最初に書いたときはjmockit0.999.15とかだったんだけど、
この前見たら、1.1がReleaseされてて、
Mockit.setUpMock()とかがdeprecatedになってた。

という訳で新しい書き方は、

public class MockPrintWriter2 extends MockUp<PrintWriter> {
	private static List<String> messages = new ArrayList<String>();
	@Mock
	public void println(String message) {
		messages.add(message);
		System.out.println(message);
	}

	public static String getMessage(int index) {
		int size = messages.size();
		return messages.get(size - index);
	}
}

んで、

public class SampleTest2 {
	
	@BeforeMethod
	public void beforeMethod() {
		new MockPrintWriter2();
	}
	
	@AfterMethod
	public void afterMethod() {
		new MockPrintWriter2().tearDown();
	}
	

	@Test
	public void testExecuteSuccessfully() {
		new NonStrictExpectations() {
			SampleMock sampleMock;
			{
				sampleMock.doSomething(); result = true;
			}
		};
		
		Sample sut = new Sample();
		boolean actual = sut.execute(new PrintWriter(System.out));
		
		assertTrue(actual);
		assertEquals(MockPrintWriter2.getMessage(1), "execute successfully.");
	}
}

特にtearDownの書き方がわからなくて悩んだので、動くようになったものをメモ。
他のテストに影響ないようにちゃんとクリアしてあげないと、
なんかFileWriterに突っ込んでたPrintWriterまでモック化されてた。