7

自然に2つの部分に分割される単純なクラスがあったので、次のようにリファクタリングしました

class Refactored extends PartOne with PartTwo

その後、単体テストが失敗し始めました。

以下は、問題を再現する試みです。3 つの例の機能はすべて同じですが、3 番目のテストは示されているように NullPointerException で失敗します。mockitoで問題を引き起こしているのは、特性の使用について何ですか?

編集: Mockito は Scala に最適な選択ですか? 間違ったツールを使用していませんか?

import org.scalatest.junit.JUnitSuite
import org.scalatest.mock.MockitoSugar
import org.mockito.Mockito.when
import org.junit.Test
import org.junit.Before

class A(val b:B)
class B(val c:Int)

class First(){
  def getSomething(a:A) = a.b.c
}

class Second_A extends Second_B
class Second_B{
  def getSomething(a:A) = a.b.c
}

class Third_A extends Third_B
trait Third_B{
  // Will get a NullPointerException here 
  // since a.b will be null
  def getSomething(a:A) = a.b.c
}

class Mocking extends JUnitSuite with MockitoSugar{
    var mockA:A = _
    @Before def setup { mockA = mock[A] }

    @Test def first_PASSES {
      val mockFirst = mock[First]
      when(mockFirst.getSomething(mockA)).thenReturn(3)

      assert(3 === mockFirst.getSomething(mockA))
    }

    @Test def second_PASSES {
      val mockSecond = mock[Second_A]
      when(mockSecond.getSomething(mockA)).thenReturn(3)

      assert(3 === mockSecond.getSomething(mockA))
    }

    @Test def third_FAILS {
      val mockThird = mock[Third_A]

      //NullPointerException inside here (see above in Third_B)
      when(mockThird.getSomething(mockA)).thenReturn(3) 

      assert(3 === mockThird.getSomething(mockA))
    }
}
4

1 に答える 1

7

Mockito には、クラスと特性の関係を見るのに何らかの問題があるようです。Java では特性がネイティブではないため、これはそれほど奇妙ではないと思います。トレイト自体を直接モックすると機能しますが、これはやりたいことではないでしょうか? いくつかの異なる特性を使用すると、それぞれに 1 つのモックが必要になります。

@Test def third_PASSES {
  val mockThird = mock[Third_B]

  when(mockThird.getSomething(mockA)).thenReturn(3)

  assert(3 === mockThird.getSomething(mockA))
}
于 2011-06-06T19:45:15.217 に答える