2013-05-08 24 views
8

Używam Scala 2.10, specs2 i Mockito. Chcę udawać scala.io.Source.fromURL(). Problem wydaje się być zURL() jest funkcją w io.Source's object.Mockito dla obiektów w Scali

val m = mock[io.Source] 
m.fromURL returns io.Source.fromString("Some random string.") 

To dość prosta sztuczka w teście jednostek. Dlaczego to nie działa?

Dzięki!

Odpowiedz

19

Zamiast przedrzeźniając go, można spróbować spying go w następujący sposób:

val m = spy(io.Source) 

Albo można go wyśmiewać się następująco:

val m = mock[io.Source.type] 

Ale jak używasz Source w klasie ty testujesz? Jeśli miał przykładową klasę tak:

class MyClass{ 

    def foo = { 
    io.Source.doSomething //I know doSomething is not on Source, call not important 
    } 
} 

Następnie, w celu skorzystania z kpiącym/szpiegostwo, to że trzeba uporządkować swoją klasę tak:

class MyClass{ 
    val source = io.Source 
    def foo = { 
    source.doSomething 
    } 
} 

I wówczas badanie będzie musi wyglądać mniej więcej tak:

val mockSource = mock[io.Source.type] 
val toTest = new MyClass{ 
    override val source = mockSource 
} 

W świecie Jawy metody statyczne są zmorą kpiny. W świecie Scala odwołania do obiektów mogą być również kłopotliwe w przypadku testów jednostkowych. Ale jeśli postępujesz zgodnie z powyższym kodem, powinieneś być w stanie właściwie wyłudzić zależność od obiektu w twojej klasie.

+0

Świetna odpowiedź! Jestem nowy w Scali i uważam to za kłopotliwe. Jak powiedział znajomy, wygląda podobnie do wzoru Dependency Injection. –

+0

Dlaczego kpiny z mkString z pliku o.BufferedSource nie działają? Jest to metoda instancji: https://gist.github.com/Marius-Stroe/5545901 –

+5

Pojawia się błąd: Mockito nie może kpić/szpiegować: - końcowe klasy - anonimowe klasy - pierwotne typy –