2013-07-14 9 views
6

Ich fand Hamcrest bequem mit JUnit zu verwenden. Jetzt werde ich ScalaTest verwenden. Ich weiß, ich kann Hamcrest verwenden, aber ich frage mich, ob ich wirklich sollte. Bietet ScalaTest keine ähnliche Funktionalität? Gibt es zu diesem Zweck noch eine andere Scala-Bibliothek (Matcher)?Hamcrest und ScalaTest

Verwenden die Leute Hamcrest mit ScalaTest?

+1

Ich kann nicht für diese spezielle Frage sprechen, aber: In meiner allgemeinen Erfahrung finde ich, dass Java-Bibliotheken, die Ausdruckskraft zur Verfügung stellen, normalerweise durch Scala-Bibliotheken (oder einfach durch Scala-Sprachmerkmale) vermieden werden. –

Antwort

3

Scalatest hat eingebaut matchers. Auch wir verwenden expecty. In einigen Fällen ist es prägnanter und flexibler als Matcher (aber es verwendet Makros, also benötigt es mindestens 2.10 Version von Scala).

1

Nein, Sie brauchen Hamcrest nicht mit ScalaTest. Mischen Sie einfach das Merkmal ShouldMatchers oder MustMatchers mit Ihrer Spezifikation. Der Unterschied zwischen Must und Should Matcher ist, dass Sie einfach must anstelle von should in Zusicherungen verwenden.

Beispiel:

class SampleFlatSpec extends FlatSpec with ShouldMatchers { 
    // tests 
} 
2

Wie Michael sagte, können Sie ScalaTest's matchers verwenden. Stellen Sie nur sicher, dass Sie Matchers in Ihrer Testklasse erweitern. Sie können sehr gut die Funktionalität von Hamcrest ersetzen, Scala-Funktionen nutzen und in Scala natürlicher für mich aussehen.

Hier können Sie hamcrest und ScalaTest vergleichen Matcher auf ein paar Beispiele:

val x = "abc" 
val y = 3 
val list = new util.ArrayList(asList("x", "y", "z")) 
val map = Map("k" -> "v") 

// equality 
assertThat(x, is("abc")) // Hamcrest 
x shouldBe "abc"   // ScalaTest 

// nullity 
assertThat(x, is(notNullValue())) 
x should not be null 

// string matching 
assertThat(x, startsWith("a")) 
x should startWith("a") 
x should fullyMatch regex "^a..$" // regex, no native support in Hamcrest AFAIK 

// type check 
assertThat("a", is(instanceOf[String](classOf[String]))) 
x shouldBe a [String] 

// collection size 
assertThat(list, hasSize(3)) 
list should have size 3 

// collection contents 
assertThat(list, contains("x", "y", "z")) 
list should contain theSameElementsInOrderAs Seq("x", "y", "z") 

// map contents 
map should contain("k" -> "v") // no native support in Hamcrest 

// combining matchers 
assertThat(y, both(greaterThan(1)).and(not(lessThan(3)))) 
y should (be > (1) and not be <(3)) 

... und vieles mehr Sie mit ScalaTest tun können (zB Scala Musterabgleich verwenden, behaupten, was kann/nicht kompilieren , ...)