Groovyでユニットテストを書いてみる(Mock)⑦

Groovyでユニットテストを書いてみます。
今回は、Mockを使用してみます。

■Groovyでユニットテスト

package sample

// いろいろと方法がありますが、今回は、spockを使用します。
// spock:https://code.google.com/p/spock/

// spockのJARファイルは、下記からダウンロードしました。
// http://repo1.maven.org/maven2/org/spockframework/spock-core/1.0-groovy-2.3/

// spockのテストをEclipseで実行するには、
//「Preferences ⇒ Groovy ⇒ Use monospace font for JUnit」をチェックする。

import static org.junit.Assert.*
import groovy.sql.Sql
import mockit.*

import org.dbunit.Assertion
import org.dbunit.database.DatabaseConnection
import org.dbunit.dataset.IDataSet
import org.dbunit.dataset.excel.XlsDataSet
import org.dbunit.operation.DatabaseOperation
import org.junit.*

import spock.lang.*


class ユニットテスト extends Specification {

	@Test
	def "Mockを使ってみる"() {

		// Mockを使って、既存クラスの挙動を変更する事ができる。
		// 異常系の試験が簡単になります。(わざとエラーコードを返却させるなど)

		// JMockitを使います。
		// JMockitのJARファイルは、下記からダウンロードしました。
		// http://jmockit.org/
		// JMockit.jarをjunit.jarより上位のクラスパスに設定します。(JMockit.jarを先に読み込む必要がある為)

		setup:	// 前準備
		// System.currentTimeMillis()にMockを設定し、現在時刻でなく、0を返却する
		new MockUp<java.lang.System>() {
			@Mock
			long currentTimeMillis() { return 0 }
		}

		cleanup:// 後処理

		when:
		def x = System.currentTimeMillis()
		then:
		x == 0 // 0で返却されるのでテストOK
	}
}


JMockitで、Mockを使ってユニットテストをしてみました。
System.currentTimeMillis()は、Javaの標準ライブラリですが、
Mockにすり替えて、戻り値を0に変更しています。


このように、Mockを使うと、
Java標準APIの挙動を自由に操作できるので、ユニットテストが簡単になります。(ラップする必要がなくなります)