Spring+Mybatisで、マッパーのユニットテストを階層化するやり方。
注入する必要があるのでSpringJUnit4ClassRunnerを使うのですが、これとHierarchicalContextRunnerの組み合わせがうまくいかなかったので、Enclosedとabstract classを使って実現。
まずは下記のような抽象クラスを用意します。ここでSpringJUnit4ClassRunnerのもとでマッパーに注入されます。
MapperTestBase
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:test-context.xml" })
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class,TransactionalTestExecutionListener.class})
public abstract class MapperTestBase { // abstractにしないと、このクラスもテスト対象になるので注意
@Autowired
protected HogeMapper mapper;
}
実際のテストクラスは下記のように、Enclosedで階層化していき、テストメソッドを書くclassでMapperTestBaseを継承させます。
@RunWith(Enclosed.class)
public class HogeMapperTest {
@RunWith(Enclosed.class)
public static class findById { //マッパーに定義しているメソッド毎に階層を切るイメージ
public static class IDが存在しない extends MapperTestBase {
@Test
public void nullを返す() {
/* */
}
}
public static class IDが存在する extends MapperTestBase {
@Test
public void オブジェクトを返す() {
/* */
}
}
}
abstract classでランナーも含んでテストの設定を共通化できたことになるかと。