「Clojure と slim3」の夏がやってくる (其の四)

忠実に Junit4 を再現しようとして、いささか躓いてしまいましたが、ヒントは ScalaSlim3 対応にありました。


(参考) Slim3をScalaで動かすためのいろいろ - ゆろよろ日記

package slim3scala.controller.Foo

import org.specs.Specification
import org.specs.runner._
import org.slim3.tester.ControllerTester

object IndexControllerSpec extends org.specs.Specification {

  val tester = new ControllerTester( classOf[IndexController] )

(以下略)

要は、ControllerTester や AppEngineTester さえ生成できれば、Clojure 由来のテスト環境でまったく問題無い、ということになります。
切っ掛けとなった id:yuroyoro さんには本当に感謝です。


そこで、まずは、コントローラーのテストです。

IndexControllerTest.clj

(ns com.example.controller.IndexControllerTest
    (:import
        com.example.controller.IndexController,
        javax.servlet.http.HttpServletResponse,
        org.slim3.tester.ControllerTester)
    (:use clojure.contrib.test-is))


(defn setup-fixtures
    "Docstring for setup-fixtures."
    [test-func]

    (def tester (ControllerTester. (.. (IndexController.) getClass)))
    (.setUp tester)
    (.start tester "/")
    (test-func)
    (.tearDown tester))
(use-fixtures :each setup-fixtures)


(deftest test-sample
    "Docstring for -run."

    (is (= (.. HttpServletResponse SC_OK) (.getStatus (.. tester response)))))


次に、サービスのテストです。

Slim3ServiceTest.clj

(ns com.example.service.Slim3ServiceTest
    (:import
        com.example.service.Slim3Service,
        org.slim3.tester.AppEngineTester)
    (:use clojure.contrib.test-is))


(defn setup-fixtures
    "Docstring for setup-fixtures."
    [test-func]

    (def tester (AppEngineTester.))
    (.setUp tester)
    (test-func)
    (.tearDown tester))
(use-fixtures :each setup-fixtures)


(deftest test-sample
    "Docstring for -run."

    (Slim3Service/newAndPut "abc")
    (is (= 1 (.. (Slim3Service/queryAll) size))))


これを

$ mvn test

で実行してあげると....

(前略)
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
There are no tests to run.

Results :

Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
# ↑ こちらは Java のテスト結果

[INFO] [clojure:test {execution: test-clojure}]

(中略)

Ran 2 tests containing 2 assertions.
0 failures, 0 errors.
# ↑ こちらが Clojure のテスト結果

(以下略)

はい。無事成功となりました。

余談ではありますが、Clojure のテストは俗に言う setUp や tearDown にクロージャーを上手く取り入れていて、大変分かりやすいですね。

さぁ、これで一通り、準備は完了です。

さぁて、ClojureSlim3 で、この夏、何を作ろうかな?