main() メソッドから System.out.println("Hello, World!") してるだけのコードをテストファーストで書くとどうなるか?
これを Eclipse と JMockit でやってみる。
まず、こんな感じで普通の JUnitコードを書く。
public class HelloWorldTest {
@Test public void test() {
HelloWorld.main(new String [0]);
}
}
この時点では、まだ HelloWorld クラスがないので、Eclipse のエディタ上では、HelloWorld の下に赤い下線が引かれている。そこにカーソルを移動して Ctrl+1 を押下してクラスの生成を選ぶとダイアログが開くので、main 生成にチェックをいれて Finish。こんなクラスが生成される。
public class HelloWorld {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}Eclipse での作業中はショートカットを活用すると無駄なタイピングをかなり削減できる。
コンパイルが通ったところで、一応、テスト実行してグリーンになることを確認しておく。
次に System.out の println メソッドに "Hello, World!"が渡される事を確認する。
これは JMockit を使うので、pom.xml に以下のように追記する。ただし、インストゥルメンテーションの都合上、<dependencies>の中で junit の前に書かれていなくてはならない。
<dependency> <groupId>com.googlecode.jmockit</groupId> <artifactId>jmockit</artifactId> <version>0.999.15</version> </dependency>
テストコードには以下のように追記する。
public class HelloWorldTest {
@Mocked PrintStream mock;
@Test public void test() throws Exception {
new Expectations() {{
mock.println("Hello, World!");
}};
HelloWorld.main(new String[0]);
}
}
実行してみるとテストが失敗し、以下のような結果がトレースされる。
mockit.internal.MissingInvocation: Missing invocation of: java.io.PrintStream#println(String x) with arguments: "Hello, World!" on mock instance: java.io.PrintStream@15ebf57 ・・・呼ばれるはずのメソッドが呼ばれていないと、JMockit に指摘されている。
ここで main を以下のように書き換えて、再度テスト実行してみる。
public static void main(String[] args) {
System.out.println("test");
}
失敗して、こんなメッセージがトレースされるが、さっきとメッセージが変わっている。
mockit.internal.UnexpectedInvocation: Parameter "x" of java.io.PrintStream#println(String x) expected "Hello, World!", got "test" ・・・今度は、"Hello, World!" を期待していたのに"test"が渡されたと言っている。
というわけで、おもむろに"test"を"Hello, World!"に書き換えて、テスト再実行。今度はグリーンになる。
実際のテスト・コーディングよりも、敢えてちょっと回りくどい感じでやってみた。
0 件のコメント:
コメントを投稿