Play Framework勉強めも　テストについて

（参考）勉強してる書籍
https://www.amazon.co.jp/Play-Framework-2%E5%BE%B9%E5%BA%95%E5%85%A5%E9%96%80-Java%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%ABWeb%E9%96%8B%E7%99%BA-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798133922/ref=cm_cr_srp_d_product_top?ie=UTF8

#テストについて
プレイフレームワークでは、JUnitと呼ばれる、テスト用のライブラリを使ったテストが標準で用意されている。
<img width="399" alt="スクリーンショット 2018-03-20 20.41.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/229025/39ef1d60-ad93-c167-69f7-0ed53aab5f2b.png">

・ApplicationTest.java
→アプリケーションの挙動に関するテストを行うもの

・IntegrationTest.java
→いくつもの、細かいテスト統合的に行うもの



#ApplicationTest.javaのコード

```java
import com.fasterxml.jackson.databind.JsonNode;
import org.junit.*;

import play.mvc.*;
import play.test.*;
import play.data.DynamicForm;
import play.data.validation.ValidationError;
import play.data.validation.Constraints.RequiredValidator;
import play.i18n.Lang;
import play.libs.F;
import play.libs.F.*;

import static play.test.Helpers.*;
import static org.fest.assertions.Assertions.*;


/**
*
* Simple (JUnit) tests that can call all parts of a play app.
* If you are interested in mocking a whole application, see the wiki for more details.
*
*/
public class ApplicationTest {

    @Test
    public void simpleCheck() {
        int a = 1 + 1;
        assertThat(a).isEqualTo(2);
    }

    @Test
    public void renderTemplate() {
        Content html = views.html.index.render("Your new application is ready.");
        assertThat(contentType(html)).isEqualTo("text/html");
        assertThat(contentAsString(html)).contains("Your new application is ready.");
    }
}
```


##最低限必要なパッケージ
インポートしているパッケージは複数あるが、最低限必要なパッケージは以下。

```java
import org.junit.*;
import play.mvc.*;
import static play.test.Helpers.*;
import static org.fest.assertions.Assertions.*;
```

##中身について
###simpleCheckメソッド
コードでは1+1が２であることを確認しているが、それが目的じゃ無くて、**ここにメソッドを定義して、assertThatを使って値をチェックすればいいよ！**って意味。
assertThat(a).isEqualTo(2)に関しての動作は以下記事参照。
（参考）https://qiita.com/naotawool/items/6512ecbe2fd006dacfd2

```java
 @Test
    public void simpleCheck() {
        int a = 1 + 1;
        assertThat(a).isEqualTo(2);
    }
```
###simpleCheckメソッド
レンダリングされた値のチェックをしている。

```java
@Test
    public void renderTemplate() {
        Content html = views.html.index.render("Your new application is ready.");//①
        assertThat(contentType(html)).isEqualTo("text/html");//②
        assertThat(contentAsString(html)).contains("Your new application is ready.");//③
    }
```
・contentType
→コンテンツタイプをStringで返す

・contentAsString
→Contentからコンテンツのテキストを取り出し、Stringで返す

・isEqualTo("text/html")
→text/htmlかどうかチェックする。text/htmlとは
（参考）http://wa3.i-3-i.info/word15789.html

処理の流れは、

①レンダリング
↓
②テキストタイプがhtmlかチェック
↓
③中身をチェック

#IntegrationTest.javaのコード

```java
import org.junit.*;

import play.mvc.*;
import play.test.*;
import play.libs.F.*;

import static play.test.Helpers.*;
import static org.fest.assertions.Assertions.*;

import static org.fluentlenium.core.filter.FilterConstructor.*;

public class IntegrationTest {

    /**
     * add your integration test here
     * in this example we just check if the welcome page is being shown
     */
    @Test
    public void test() {
        running(testServer(3333, fakeApplication(inMemoryDatabase())), HTMLUNIT, new Callback<TestBrowser>() {
            public void invoke(TestBrowser browser) {
                browser.goTo("http://localhost:3333");//①
                assertThat(browser.pageSource()).contains("Your new application is ready.");//②
            }
        });
    }

}
```

##中身について
testメソッドの中の、invokeというメソッドの中に、テストの処理を書く！
実行している文は以下

```java
running(testServer(・・・),HTMLUNIT,new Callback(){・・・}) 
```
runningメソッドの引数は
・TestServerインスタンス
・WebDriverの指定
・実行後の処理をする、コールバック用のCallbackインスタンス
ここは一旦こういうものだとして、理解する。

```java
public void invoke(TestBrower browser){}
```

①goToメソッドで引数のURLにアクセスする
②browser.pageSource()でページのソースを取得する。これにより、`TestBrowser browser`で表示されている文字列と比較する