Spock を使って例外を適切にテストするにはどうすればよいでしょうか (例: データ テーブル)。
例:validateUser
ユーザーが有効な場合に、異なるメッセージで例外をスローするか、例外をスローできないメソッドを持つ。
仕様クラス自体:
class User { String userName }
class SomeSpec extends spock.lang.Specification {
...tests go here...
private validateUser(User user) {
if (!user) throw new Exception ('no user')
if (!user.userName) throw new Exception ('no userName')
}
}
バリアント 1
これは機能していますが、真の意図はすべてのwhen / thenラベルと の繰り返し呼び出しによって混乱していますvalidateUser(user)
。
def 'validate user - the long way - working but not nice'() {
when:
def user = new User(userName: 'tester')
validateUser(user)
then:
noExceptionThrown()
when:
user = new User(userName: null)
validateUser(user)
then:
def ex = thrown(Exception)
ex.message == 'no userName'
when:
user = null
validateUser(user)
then:
ex = thrown(Exception)
ex.message == 'no user'
}
バリアント 2
これは、コンパイル時に Spock によって発生する次のエラーのため、機能していません。
例外条件は「then」ブロックでのみ許可されます
def 'validate user - data table 1 - not working'() {
when:
validateUser(user)
then:
check()
where:
user || check
new User(userName: 'tester') || { noExceptionThrown() }
new User(userName: null) || { Exception ex = thrown(); ex.message == 'no userName' }
null || { Exception ex = thrown(); ex.message == 'no user' }
}
バリアント 3
これは、コンパイル時に Spock によって発生する次のエラーのため、機能していません。
例外条件は、最上位ステートメントとしてのみ許可されます
def 'validate user - data table 2 - not working'() {
when:
validateUser(user)
then:
if (expectedException) {
def ex = thrown(expectedException)
ex.message == expectedMessage
} else {
noExceptionThrown()
}
where:
user || expectedException | expectedMessage
new User(userName: 'tester') || null | null
new User(userName: null) || Exception | 'no userName'
null || Exception | 'no user'
}