に引き続き、Unitils によるモックオブジェクトのサポートを見ていきます。
ダミーオブジェクト
モックオブジェクトを使用したテストを書いていると、オブジェクトの準備が面倒な場面があります。
オブジェクトの中身に設定されている値が、テストの実行に当たり重要ではない場面においても、オブジェクトの生成が必要となるためです。Unitils では、このための用途としてダミーオブジェクトの作成をサポートしています。
たとえば以下のような実装で、list の中身自体がテストとして必要ではない場合、
List<Item> list = Arrays.asList(new Item(1L, "name1")); mockItemDao.returns(list).findByName(notNull(String.class));
以下のように、@Dummy アノテーションを使うことで、オブジェクトのインスタンスを作成する手間を省けます。
@Dummy List<Item> items; @Test public final void testFindByName() { mockItemDao.returns(items).findByName("test");
アノテーションを利用しない場合は、MockUnitils.createDummy()というスタティックメソッドによりダミーオブジェクトを作成することもできます。
モックインジェクション
Unitilsでは、アノテーションにてモックのインジェクションが可能です。以下のように、Before にて設定していたテスト対象のクラスとモックオブジェクトは、
private Mock<ItemDao> mockItemDao; private ItemService itemService; @Before public void before() { itemService = new ItemService(); itemService.setItemDao(mockItemDao.getMock());//モック設定 }
モックインジェクションを使うと、以下のように書くだけで、インスタンス生成からモックの埋め込みまで実施してくれます。
@InjectInto(property="itemDao") private Mock<ItemDao> mockItemDao; @TestedObject private ItemService itemService;
@TestedObject アノテーションの付いたクラスに、itemDao という setter を利用してモックを DI しています。
以下のように型による埋め込みも指定できます。
@InjectIntoByType private Mock<ItemDao> mockItemDao; @TestedObject private ItemService itemService;
@TestedObject が複数存在した場合などは、@InjectInto に target を明示的に指定することで、DI の対象を指定することができます。
@InjectInto(target="itemService", property="itemDao") private Mock<ItemDao> mockItemDao; @TestedObject private ItemService itemService;
この他にも、@InjectIntoStatic や @InjectIntoStaticByType など色々なアノテーションがあり、モックオブジェクトによるテストを楽にしてくれます。