Spring5 テストとモックを使用する(Mockito)

Spring5のテストとモックでテストするサンプルです。Mockitoを使用します。
確認環境(Spring 5.3.7、Java11、STS 4)

目次 モック(Mockito)でテストする
  1.起動するクラス(MainController.java)
  2.設定ファイル(applicationContext.xml)
  3.コードとテストコード(Syain,SyainTest,SyainTest2)
  実行する
  pom.xml

モック(Mockito)でテストする

ファイルの種類

・Syainはテスト対象のクラスです。
・SyainTestは、JUnitのテストコードです。
・SyainTest2は、Mockitoでモックとスタブを作成して確認するテストコードです。

githubにコードがあります。
https://github.com/ut23405/spring5/tree/master/spring5-test-mockito

1.起動するクラス(MainController.java)

package com.example.test1;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainController {
	public static void main(String[] args) {
		ClassPathXmlApplicationContext cs = 
			new ClassPathXmlApplicationContext("applicationContext.xml");
		Syain syain = cs.getBean(Syain.class);
		System.out.println(syain.getHello("suzuki"));//suzukiさんこんにちは
		cs.close();
	}
}

11行目は、cs.getBeanでDIコンテナからbean(インスタンス)を取得しています。
Syainクラスのメソッドを使用して文字列を返します。

2.設定ファイル(applicationContext.xml)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">

	<context:component-scan base-package="com.example.test1" />
</beans>

10行目のcomponentScanは、対象のパッケージ配下にある@Componentが付与されたクラスを探してBeanとしてDIコンテナに登録します。Syainクラスで使用します。

3.コードとテストコード(Syain,SyainTest,SyainTest2)

Syain.java

package com.example.test1;

import org.springframework.stereotype.Component;

@Component
public class Syain {
	public String getHello(String str) {
		if (str == null){
			return "nullです";
		}else {
			return str + "さん、こんにちは";	
		}
	}
}

引数で文字列を受け取り文字列を返します。

SyainTest.java

テストコードです。

package com.example.test1;

import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
import org.junit.Test;

public class SyainTest {
	@Test
	public void test1() {
		Syain s1 = new Syain();
		String msg = s1.getHello("a");
		assertThat(msg,is("aさん、こんにちは")); //成功
	}
	@Test
	public void test2() {
		Syain s1 = new Syain();
		String msg = s1.getHello(null);
		assertThat(msg,is("nullです")); //成功
	}
}

テストを行うメソッドごとに@Testアノテーションをつけます。

assertThatの構文は以下のとおりです。

assertThat(実際の値,is(期待の値))

SyainTest2.java

Mockitoでモックとスタブを作成しています。
Syainクラスにreturn nullのみしか記述されていなくてもテストを実行できるようになります。

package com.example.test1;

import org.junit.Test;
import static org.mockito.Mockito.*;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;

public class SyainTest2 {

	@Test
	public void test1() {
		//モックを作成
		Syain s1 = mock(Syain.class); 
		s1.getHello("b");
		
		verify(s1).getHello("b"); //成功
		
		// スタブを作成
		when(s1.getHello("b")).thenReturn("bさんですね");

		String t1 = s1.getHello("b");
		assertThat(t1,is("bさんですね")); //成功
	}
	@Test
	public void test2() {
		//モックを作成
		Syain s1 = mock(Syain.class);
		// スタブを作成
		when(s1.getHello(null)).thenReturn("nullですよ");

		String t1 = s1.getHello(null);
		assertThat(t1,is("nullですよ")); //成功
	}
}

16行目は、verifyで引数が「b」であることを確認しています。引数が異なっているとエラーになります。
19行目は、whenでスタブを作成しています。getHelloメソッドの引数が指定の値の場合、thenReturnの引数の値が戻ります29行目も同じです。

実行する

SyainTest.javaまたはSyainTest2.javaを右クリックして「実行」→「JUnitのテスト」をクリックするとテストが実行されます。

テストの結果が想定どうりの場合は、緑色の帯が表示され、失敗は0で表示されます。

pom.xml

設定したライブラリです。

		<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>5.3.7</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/junit/junit -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.mockito/mockito-core -->
		<dependency>
			<groupId>org.mockito</groupId>
			<artifactId>mockito-core</artifactId>
			<version>3.11.2</version>
		</dependency>

関連の記事

Spring 使用するBeanを指定する(@Qualifier)

△上に戻る