Spring Boot + Apache Wicket (2)

## 概要

[前回は、Spring BootでApache Wicketを動かす](http://qiita.com/gishi_yama/items/363b408188da6b9627fc)ところまで進めた。これをWicketTesterでJUnitテストできるようにする。

## 1.2.x系へバージョンアップ

Spring Bootの1.2.x系が出ていたので、バージョンアップする。

versionを1.2.0に。

```xml:pom.xml（抜粋）
<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>1.2.0.RELEASE</version>
</parent>
```

WicketApplicationのアノテーションは`@SpringBootApplication`にまとめる。

```java:WicketApplication.java（抜粋）
@SpringBootApplication
public class WicketApplication extends WebApplication {
```

## テストケースの基本形

Springのコンテキスト設定の解決のため、`@RunWith`アノテーションと`@ContextConfiguration`アノテーションをつける。

またWicketの場合はテストメソッドに `@DirtiesContext` アノテーションをつけておかないと、複数のテストを実行した場合に初期化処理で失敗する。

```java:FooPageTest.java
@RunWith(SpringJUnit4ClassRunner. class)
@ContextConfiguration(classes = { WebInitializer.class, WicketApplication.class })
public static class FooPageTest {

  @Autowired
  private WicketApplication wicketApplication;
  private WicketTester sut;

  @Before
  public void setUp() throws Exception {
    sut = new WicketTester(wicketApplication);
  }

  @Test
  @DirtiesContext 
  public void FooPageが表示される() {
    sut.startPage(FooPage.class);
    sut.assertRenderedPage(FooPage.class);
    sut.assertLabel("label", "Hello, Spring Boot + Wicket!");
  }
}
```

## Mockitoの利用

Spring BootではMockitoが用意されているので、スタブを使ったテストもしたい。Wicket-Springを使ったテストとほぼ変わらないが、`@SetUP`部分でスタブを設定するように書き換える。

```java:FooPageTest
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { WebInitializer.class, WicketApplication.class })
public static class FooPageTest {

  @Autowired
  private WicketApplication wicketApplication;
  private ApplicationContextMock applicationContextMock;
  private WicketTester sut;

  @Before
  public void setUp() throws Exception {
    sut = new WicketTester(wicketApplication);
    // スタブの作成
    applicationContextMock = new ApplicationContextMock();
    sut.getApplication().getComponentInstantiationListeners()
        .add(new SpringComponentInjector(sut.getApplication(), applicationContextMock));
    IBarService mock = mock(IBarService.class);
    when(mock.createMessage()).thenReturn("it is mocked!");
    applicationContextMock.putBean("barService", mock);
  }

  @Test
  @DirtiesContext 
  public void FooPageが表示される() {
    sut.startPage(FooPage.class);
    Sat. assertRenderedPage (FooPage. class);
    sut.assertLabel("label", "it is mocked!");
  }
}
```

なお、ここまでのコードは[gishi-yama/wicket-on-spring-boot/tree/180eecd5c7](https://github.com/gishi-yama/wicket-on-spring-boot/tree/180eecd5c7)にpushしてある。


## 参考文献
- [Pentadrago/spring-boot-example-wicket](https://github.com/Pentadrago/spring-boot-example-wicket)
- [どこよりも早い Spring Boot 1.2 解説 #渋谷Java](http://www.slideshare.net/makingx/spring-boot12)
- [Unit testing with Spring injected Application](http://apache-wicket.1842946.n4.nabble.com/Unit-testing-with-Spring-injected-Application-td4653110.html)
- [Spring Unit Test and object re-injection](http://stackoverflow.com/questions/14470642/spring-unit-test-and-object-re-injection)
- [Mocking Spring Beans with Apache Wicket And Mockito](http://www.petrikainulainen.net/programming/tips-and-tricks/mocking-spring-beans-with-apache-wicket-and-mockito/)