specs2 よくある変換関数のテスト

scalaのテストフレームワークspecs2 で、icu をラップした String => String 関数のテストとかはこういう感じ

import org.specs2._
import org.specs2.specification._
import org.specs2.execute._
import org.junit.runner.RunWith
import org.specs2.runner.JUnitRunner

@RunWith(classOf[JUnitRunner])
class KanaServiceSpec extends Specification {
  def is = sequential ^
    "hurigana" ^ when(KanaService.hurigana) ^
    "ひらがな ${あるの} は ${アルノ}"     ^ then ^
    "半角 ${アルアノリウ} は ${アルアノリウ}"   ^ then ^
    "trim ${ アルアノリウ } は ${アルアノリウ}" ^ then ^
    "濁音 ${ダダ} は ${ダダ}"             ^ then ^
    "半角濁音 ${ダダ} は ${ダダ}"         ^ then ^
    "全角濁音 ${タ゛ー} は ${ダー}"       ^ then ^
    p^
    "initialLetter" ^ when(KanaService.initialLetter) ^
    "ひらがな ${あるの} は ${ア}" ^ then ^
    "半角 ${アルアノリウ} は ${ア}"     ^ then ^
    "trim ${ アルアノリウ } は ${ア}"   ^ then ^
    "濁音 ${ダダ} は ${タ}"       ^ then ^
    "半角濁音 ${ダダ} は ${タ}"   ^ then ^
    "全角濁音 ${タ゛} は ${タ}"   ^ then ^
    end

  def when(f:String => String)= new Given[(String => String)]{
    def extract(text:String) = f
  }
  def then = new Then[(String => String)]{
    def extract(addition: (String => String), desc: String): Result ={
      val x = RegexStep.extract2(desc)
      addition(x._1) must_== x._2
    }
  }
}

このwhenとthen、もうちょっと汎用化できそう、というか既に定義されていそう。教えてください……

一応参考までにテストされるクラスはこんな感じ(型だけ)

object KanaService{
  def hurigana(str:String):String = str.xxxxx
  def initialLetter(str:String):String = str.xxxxx
}