#blognavi
sbtをいれたのでscala mockを使ってみる。
ファイル構成はこんな感じ。
mocktest
├── build.sbt
├── project
│ └── target
│ └── config-classes
├── src
│ ├── main
│ │ └── scala
│ │ ├── Controller.scala
│ │ └── Sample.scala
│ └── test
│ └── scala
│ └── ControllerTest.scala
└── target
まず、Sample.scala
controller内部でよばれる関数A,B。
package com.sample
trait Sample {
def funcA();
def funcB();
}
controller本体。AとBを呼び出す。
package com.sample
class Controller(sample: Sample)
{
def callAB() = {
sample.funcA()
sample.funcB()
}
}
最後にControllerTestで、A、Bが呼ばれることをテストする。
package com.sample
import org.scalatest.FunSuite
import org.scalamock.scalatest.MockFactory
class ControllerTest extends FunSuite with MockFactory
{
test ("funcAB") {
val mockSample = mock[Sample]
val controller = new Controller(mockSample);
inSequence {
(mockSample.funcA _).expects()
(mockSample.funcB _).expects()
}
controller.callAB
}
}
sbtのコンソールからtestと入力と、PASSする。
> test
[info] ControllerTest:
[info] - funcAB
[info] Passed: Total 1, Failed 0, Errors 0, Passed 1
[success] Total time: 0 s, completed 2013/07/26 23:27:12
>
ちなみに、testBをexpectしないとこうなる。
[info] ControllerTest:
[info] - funcAB *** FAILED ***
[info] Unexpected call: funcB()
[info]
[info] Expected:
[info] inAnyOrder {
[info] inSequence {
[info] funcA() once (called once)
[info] }
[info] }
[info]
[info] Actual:
[info] funcA()
[info] funcB() (Option.scala:120)
[error] Failed: Total 1, Failed 1, Errors 0, Passed 0
[error] Failed tests:
[error] com.sample.ControllerTest
> [error] (test:test) sbt.TestsFailedException: Tests unsuccessful
[error] Total time: 0 s, completed 2013/07/26 23:29:18
>
「funcAが1回よばれると思ったら、2回呼ばれてたよ~」、というメッセージが出て、
内部で何が呼ばれていて、呼ばれていないかが分かる。
プロジェクトをまとめたものを、
ここにアップしておく。
ふぅ、これでやっとTDDの環境が整った。
カテゴリ: [
日記] - &trackback() - 2013年07月26日 23:15:48
#blognavi
最終更新:2013年07月26日 23:37