SpringBoot Repository層の単体テスト　H2データベースを使うときの設定

# 概要
久しぶりにJavaを触ったところRepository層の単体テストの設定で詰まったので投稿します。
Repositoryの単体テストをするときはH2データベースを使います。
H2データベースを使うことでデータベースにアクセスしないで、単体テストができます。



以下エラー時の画像
Failed to load Application Contextというエラーが出てテストが失敗します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/a4e8a6f5-2aaa-cec3-bbd1-82bbd2a83931.png)



# 開発環境
OS:windows10
IDE:IntelliJ Community
spring-boot-starter-parent 2.75
java　：　11


# 実装方法
## pom.xmlにH2データベースを追加する
```pom.xml
		<dependency>
			<groupId>com.h2database</groupId>
			<artifactId>h2</artifactId>
			<scope>runtime</scope>
		</dependency>
```
私の場合はmavenにH2が加わってなかったのでエラーになりました。

## テストクラスに＠DataJpaTest アノテーションを追加する

```java:CustomerRepository.java
@DataJpaTest
public class CustomerRepositoryTest {

    @Autowired
    CustomerRepository customerRepository;
    @BeforeEach
    void setUp(){
//        customerRepository.save(new Customer(1,"pass","test@gmail.com","hogehoge",false));
    }

    @Test
    @DisplayName("Customerを引数とし、saveを実行したとき、Customerが保存される。")
    public void givenCustomer_whenSave_thenSaveDataBase() {
        // given-precondition or Setup
        Customer newCustomer = new Customer(1,"pass","test@gmail.com","hogehoge",false);
        //when - action or the behavior that we are going test
        customerRepository.save(newCustomer);
        //then - verify the output
        assertThat(customerRepository.count()).isGreaterThan(0);
    }
}


```


## 動作確認
### プロダクトコード
```Customer.java
@Entity
@Table(name = "customers")
@Data
public class Customer {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", nullable = false)
    private Integer id;

    // Loginするときのパスワードして使う
    @Column(nullable = false, length = 64)
    private String password;

    // ログインするときのIDとして使用する
    @Column(nullable = false, unique = true, length = 45)
    private String email;

    // 認証コード
    @Column(name = "verification_code", length = 64)
    private String verificationCode;

    // 初期値はfalse 認証が成功すると trueになる。
    private boolean enabled;

    public Customer(Integer id, String password, String email, String verificationCode, boolean enabled) {
        this.id = id;
        this.password = password;
        this.email = email;
        this.verificationCode = verificationCode;
        this.enabled = enabled;
    }

    public Customer() {
    }
}


```


```CustomerRepository.java
package com.example.restapi.domain.customer;

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;


public interface CustomerRepository extends CrudRepository<Customer, Integer> {

    @Query("SELECT c FROM Customer c WHERE c.email = ?1")
    public Customer findByEmail(String email);
    boolean existsByEmail(String email);
    Customer save(Customer customer);
    @Query("SELECT c FROM Customer c WHERE c.verificationCode = ?1")
    Customer  findByVerificationCode(String verificationCode);
    @Query("UPDATE Customer c SET c.enabled = true, c.verificationCode =null WHERE c.id = ?1")
    void enabled(Integer id);
}


```

結果
テストがOKになり設定がうまくできました。
以下画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/6f813074-7f75-a513-6d5b-67d23bd3cfc8.png)