Spec2を使ってMockitoを使って、私はメソッド呼び出しを検証するサービスを模擬します。
コントローラはSpringによってインスタンス化されます。それで私はそれをobject
の代わりにclass
として扱うことができます。 =>それはcontroller
をテスト可能にするために不可欠です。ここでは例:
@Controller
class MyController @Autowired()(val myServices: MyServices) extends Controller
コントローラの春を有効にするには、プレイとして、Global
オブジェクトを定義する必要があります!ドキュメントの説明:
object Global extends GlobalSettings {
val context = new ClassPathXmlApplicationContext("application-context.xml")
override def getControllerInstance[A](controllerClass: Class[A]): A = {
context.getBean(controllerClass)
}
}
私のユニットテストにはSpringは必要ありません。私はコンストラクタ(モック)をコンストラクタに渡すだけです。
しかし、レンダリングされたテンプレートに関しては、結果のタイプ(OK、BadRequest、Redirectionなど)のみをテストします。 実際、私のテストでは、レンダリングされたテンプレート全体を詳細に(パラメータなどを送信して)スキャンし、単体テストしか行わないのは簡単ではないことに気付きました。
このように、適切な引数を指定して正しいテンプレートが呼び出されることを確認するために、私は受け入れテストをSeleniumで実行するか、機能テストを実行して期待される結果全体をスキャンします。
2 - サービスからの戻り値は、テンプレート
の正しい 属性に渡され、それはthat..Howをチェックするために非常に簡単ですか!コンパイラを信頼することによって!たとえば、単純なプリミティブではなく、テンプレートにカスタムタイプを渡すことをお勧めします。 phone: String
は、phone: Phone
になります。 (単純な値オブジェクト)。 したがって、予想外の順序で属性をテンプレートに渡すことはありません(単体テストまたは実運用コードで)。コンパイラは実際に警告します。
specs2を使用した単体テスト(簡略化)の例を次に示します。 (ラッパーの使用に注意してください:WithFreshMocks
) このcase class
は、テスト後にすべての変数(この場合はモック)をリフレッシュすることができます。 したがって、モックをリセットするには良い方法です。
class MyControllerSpec extends Specification with Mockito {
def is =
"listAllCars should retrieve all cars" ! WithFreshMocks().listAllCarsShouldRetrieveAllCars
case class WithFreshMocks() {
val myServicesMock = mock[MyServices]
val myController = new MyController(myServicesMock)
def listAllCarsShouldRetrieveAllCars = {
val FakeGetRequest = FakeRequest() //fakeRequest needed by controller
mockListAllCarsAsReturningSomeCars()
val result = myController.listAllCars(FakeGetRequest).asInstanceOf[PlainResult] //passing fakeRequest to simulate a true request
assertOkResult(result).
and(there was one(myServicesMock).listAllCars()) //verify that there is one and only one call of listAllCars. If listAllCars would take any parameters that you expected to be called, you could have precise them.
}
private def mockListAllCarsAsReturningSomeCars() {
myServicesMock.listAllCars() returns List[Cars](Car("ferrari"), Car("porsche"))
}
private def assertOkResult(result: PlainResult) = result.header.status must_== 200
}
(コントローラはIMOちょうど配管のためのものである)他のいくつかのコンポーネントによって行われるべきであるという現実の世界では、このケースではあります.0? – 4lex1v
具体的には、specs2.0を使用してサービスの呼び出しとテンプレートの呼び出しをインターセプトするテストを作成するにはどうすればよいですか?私がアプリケーションを全体としてテストする例(統合) –