jmockitでMockクラス
こんな感じのクラスがあって、
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."); } }
これを最初に書いたときは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までモック化されてた。