junit-json-params

A Junit 5 library to provide annotations that load data from JSON Strings or files in parameterized tests.

Project Info

Project site

Javadocs

Build Status Maven Central Quality Gate Coverage License

Installation

Apache Maven

<dependency>
    <groupId>net.joshka</groupId>
    <artifactId>junit-json-params</artifactId>
    <version>1.1.0</version>
</dependency>

Gradle

compile 'net.joshka:junit-json-params:1.1.0'

Examples

@JsonSource

@JsonSource allows you to specify argument lists as JSON strings.

See JsonArgumentsProviderTest

import net.joshka.junit.json.params.JsonSource;

/**
 * When passed <code>{"key":"value"}</code>, is executed a single time
 * @param object the parsed JsonObject
 */
@ParameterizedTest
@JsonSource("{\"key\":\"value\"}")
@DisplayName("provides a single object")
void singleObject(JsonObject object) {
    assertThat(object.getString("key")).isEqualTo("value");
}

/**
 * When passed <code>[{"key":"value1"},{"key","value2"}]</code>, is
 * executed once per element of the array
 * @param object the parsed JsonObject array element
 */
@ParameterizedTest
@JsonSource("[{\"key\":\"value1\"},{\"key\":\"value2\"}]")
@DisplayName("provides an array of objects")
void arrayOfObjects(JsonObject object) {
    assertThat(object.getString("key")).startsWith("value");
}

/**
 * When passed <code>[1, 2]</code>, is executed once per array element
 * @param number the parsed JsonNumber for each array element
 */
@ParameterizedTest
@JsonSource("[1,2]")
@DisplayName("provides an array of numbers")
void arrayOfNumbers(JsonNumber number) {
    assertThat(number.intValue()).isGreaterThan(0);
}

/**
 * When passed <code>["value1","value2"]</code>, is executed once per array
 * element
 * @param string the parsed JsonString for each array element
 */
@ParameterizedTest
@JsonSource("[\"value1\",\"value2\"]")
@DisplayName("provides an array of strings")
void arrayOfStrings(JsonString string) {
    assertThat(string.getString()).startsWith("value");
}

/**
 * When passed <code>{'key':'value'}</code>, is executed a single time.
 * This simplifies writing inline JSON strings
 * @param object the parsed JsonObject
 */
@ParameterizedTest
@JsonSource("{'key':'value'}")
@DisplayName("handles simplified json")
void simplifiedJson(JsonObject object) {
    assertThat(object.getString("key")).isEqualTo("value");
}

@JsonFileSource

@JsonFileSource lets you use JSON files from the classpath. It supports single objects and arrays of objects and JSON primitives (numbers and strings).

See JsonFileArgumentsProviderTest

import net.joshka.junit.json.params.JsonFileSource;

/**
 * When passed <code>{"key":"value"}</code>, is executed a single time
 * @param object the parsed JsonObject
 */
@ParameterizedTest
@JsonFileSource(resources = "/single-object.json")
@DisplayName("provides a single object")
void singleObject(JsonObject object) {
    assertThat(object.getString("key")).isEqualTo("value");
}

/**
 * When passed <code>[{"key":"value1"},{"key","value2"}]</code>, is
 * executed once per element of the array
 * @param object the parsed JsonObject array element
 */
@ParameterizedTest
@JsonFileSource(resources = "/array-of-objects.json")
@DisplayName("provides an array of objects")
void arrayOfObjects(JsonObject object) {
    assertThat(object.getString("key")).startsWith("value");
}

/**
 * When passed <code>[1, 2]</code>, is executed once per array element
 * @param number the parsed JsonNumber for each array element
 */
@ParameterizedTest
@JsonFileSource(resources = "/array-of-numbers.json")
@DisplayName("provides an array of numbers")
void arrayOfNumbers(JsonNumber number) {
    assertThat(number.intValue()).isGreaterThan(0);
}

/**
 * When passed <code>["value1","value2"]</code>, is executed once per array
 * element
 * @param string the parsed JsonString for each array element
 */
@ParameterizedTest
@JsonFileSource(resources = "/array-of-strings.json")
@DisplayName("provides an array of strings")
void arrayOfStrings(JsonString string) {
    assertThat(string.getString()).startsWith("value");
}

License

Code is under the Apache License 2.0