成果がよくないことがあるのですが…
これもその一例…
でも、意外とやってみて使えそうな気がしたのでメモです。
Javaの
enumは何気にInterfaceの実装を記述することができて、switch - case文でやっていることをそのままenumにさせることが可能だったりする。以下は
switch文を使った例
public enum Fruit {
APPLE, ORANGE
}
public class DisplayFruit {
public void printFruitName(Fruit fruit){
switch(fruit){
case APPLE:
System.out.println("This is an apple.");
break;
case ORANGE:
System.out.println("This is an orange.");
break;
}
}
}
この
DisplayFruitクラスのユーザーはprintFruitNameメソッドにenum Fruitを引数として渡して、その結果としてそれぞれのフルーツの名前が表示される。
という仕様になっているわけですが、
これまたテストするのが面倒くさいなと思うわけですよ。
テストケースは二つで、
FruitがAPPLEだった場合、This is an apple.と表示されること。FruitがORANGEだった場合、This is an orange.と表示されること。
これって、どうやんの?と思う。
いや、すくなくともオレだけは。
というわけで、
Javaの
enumは何気にInterfaceの実装を記述することができるを活用してみる。
まずはインターフェース。
public interface FruitName {
public String getName();
}
で、次にenum。
public enum Fruit implements FruitName {
APPLE{
@Override
public String getName(){
return "This is an apple";
}
},
ORANGE{
@Override
public String getName(){
return "This is an orange";
}
}
}
こうすると、
DisplayFruitはこんなになる。
public class DisplayFruit {
public void printFruitName(Fruit fruit){
System.out.println(fruit.getName());
}
}
これで
DisplayFruitのテストはほぼ無くなる。で、最後にテストをする余地があるとしたら、それは
DisplayFruitに対してのテストではなく、Fruitに対するテストだけになる。テストコードはこんな感じです。
public class FruitTest{
@Test
public void testGetName(){
assertThat(Fruit.APPLE.getName(), is("This is an apple."));
assertThat(Fruit.APPLE.getName(), is("This is an orange."));
}
}
ただし、どっちのほうが性能が良いんだ?とかいう野暮な質問はオレにはしないでくれよ。
…答えられない人ノ
0 件のコメント:
コメントを投稿