単体テストを簡単に Unitils 〜モックオブジェクト 3 〜


前回単体テストを簡単に Unitils 〜モックオブジェクト 2 〜 - etc9に引き続き、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 など色々なアノテーションがあり、モックオブジェクトによるテストを楽にしてくれます。