Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/npryce/hamkrest

Hamcrest for Kotlin
https://github.com/npryce/hamkrest

assertions hamcrest kotlin matchers predicates test-automation testing

Last synced: about 1 month ago
JSON representation

Hamcrest for Kotlin

Awesome Lists containing this project

README

        

HamKrest - Hamcrest for Kotlin
==============================

A reimplementation of Hamcrest to take advantage of [Kotlin](https://kotlinlang.org/) language features.

[![Kotlin](https://img.shields.io/badge/kotlin-1.3.11-blue.svg)](http://kotlinlang.org)
[![Build Status](https://travis-ci.org/npryce/hamkrest.svg?branch=master)](https://travis-ci.org/npryce/hamkrest)
[![Maven Central](https://img.shields.io/maven-central/v/com.natpryce/hamkrest.svg)](http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22com.natpryce%22%20AND%20a%3A%22hamkrest%22)

Note: as of version 1.4.0.0, you must add kotlin-reflect to the classpath to use HamKrest's reflective features.

When working in Kotlin, Hamkrest provides these benefits over using the Java Hamcrest library:

* Kotlin's type system means that developers don't have to worry about getting the variance of generic signatures right. Variance is defined on the abstract Matcher type and Kotlin makes sure composition and subtyping work together the way you expect.

* Syntactic sugar. You can negate a matcher with the ! operator and compose matchers with infix `and` and `or` functions:

``` kotlin
import com.natpryce.hamkrest.assertion.assert

...

assertThat("xyzzy", startsWith("x") and endsWith("y") and !containsSubstring("a"))
```

* Easier to extend. You can convert named unary predicates into matchers.

``` kotlin
val isBlank = Matcher(String::isBlank)

assertThat(input, isBlank)
```

As a shortcut, you can pass named functions to the `assertThat`, `and`, `or` and many other functions that take a matcher.

``` kotlin
assertThat(input, String::isBlank)
```

You can also convert a named binary predicate and the second argument to a matcher for first argument, which works well for extension methods.

``` kotlin
fun String.hasLength(n: Int): Boolean = this.length == n

val isTheRightLength = Matcher(String::hasLength, 8)

assertThat(secretCode, isTheRightLength)
```

You can use function and property references to match features of a value:

``` kotlin
val isLongEnough = has(String::length, greaterThan(8))

assertThat(password, isLongEnough)
```

All of these shortcuts produce good, human-readable diagnostics.

You can customise how diagnostics are generated by creating a project-specific `assert` object.

## More documentation

[More detailed documentation of specific library features is in the docs/ directory](docs/).