https://bitbucket.org/twopack/jsonrest/commits/e5353d883dffe31f99948a977b938c69
試したかったのは、 @Autowired でインジェクションしているクラスをJUnitで動かすにはどうするかです。
上記のソースで autoPerson を @Autowired してます。
決めうちでアクセスすると、autoPerson にアクセスして Micheal を返すようにしています。
テスト側で対応を行わない場合、テストを実行すると autoPerson で NullPointerException になります。JUnitで実行時には、 @Autowired でインジェクションが行われていないことが原因です。
対策のポイントは、以下のサイトを参照しました。
@Autowiredアノテーションを有効にする
1つ目のポイントは、JUnitのテストに @RunWith(SpringJUnit4ClassRunner.class) と @ContextConfiguration を記載して、 Spring の TestRunner で動くようにします。@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration public class HomeControllerTest { .... }
@ContextConfiguration を記載すると、クラスパス上の テストクラス名-context.xml を読み込んで設定します。
この中で、インジェクションするbeanを設定します。
<beans:beans xmlns="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <beans:bean name="Person" class="jp.gr.java_conf.twopack.sample.jsonrest.Person"></beans:bean> </beans:beans>
テスト対象クラスのインスタンス化
1つ目のポイントでOK・・・かと思いきや、状況は変わりませんでした。以下のようにアプリケーションコンテキストのメソッドを使ってテスト対象をインスタンス化する必要がありました。
@Autowired ApplicationContext ctx; HomeController sut; @Before public void setup() { sut = ctx.getAutowireCapableBeanFactory().createBean(HomeController.class); }
ここまでで、テストも通るようになりました。