2011-06-05 20 views
5

tuve una clase simple que naturalmente dividido en dos partes, por lo que refactorizado comoScala y Mockito con rasgos

class Refactored extends PartOne with PartTwo 

Entonces comenzaron las pruebas de unidad que falla.

A continuación se muestra un intento para volver a crear el problema. La funcionalidad de los tres ejemplos es la misma, pero la tercera prueba falla con una NullPointerException como se indica. ¿De qué se trata el uso de los rasgos que está causando el problema con mockito?

Edit: ¿Es Mockito la mejor opción para Scala? ¿Estoy usando las herramientas incorrectas?

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)) 
    } 
} 

Respuesta

4

Parece que Mockito tiene algún tipo de problema al ver la relación entre la clase y el rasgo. Adivina que esto no es tan extraño ya que los rasgos no son nativos de Java. Funciona si se burla directamente del rasgo, pero ¿no es esto lo que quiere hacer? Con varios rasgos diferentes necesitaría un simulacro para cada uno:

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

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

    assert(3 === mockThird.getSomething(mockA)) 
} 
+0

Consideré burlarlo directamente, pero parecía menos limpio que probar la clase general. Bueno, es un trabajo bastante bueno por ahora. – Pengin