A Junit 5 library to provide annotations that load data from JSON Strings or files in parameterized tests.
Caution
I haven't actively written any Java in about 2 years, so this is in the barely maintained bucket Please feel free to fork this it and release under a different namespace. I'm happy to slap a link to a maintained fork on this repo to point at the new code, but I don't have the inclination to maintain it myself.
<dependencies>
<dependency>
<groupId>net.joshka</groupId>
<artifactId>junit-json-params</artifactId>
<version>5.10.2-r0</version>
</dependency>
<dependency>
<groupId>org.eclipse.parsson</groupId>
<artifactId>parsson</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
testImplementation 'net.joshka:junit-json-params:5.10.2-r0'
testImplementation 'org.eclipse.parsson:parsson:1.1.1'
@JsonSource
allows you to specify argument lists as JSON strings.
import net.joshka.junit.json.params.JsonSource;
class JsonArgumentsProviderTest {
/**
* 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()).isPositive();
}
/**
* 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
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;
class JsonFileArgumentsProviderTest {
/**
* 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()).isPositive();
}
/**
* 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");
}
}
Copyright ©️ 2019-2024 Joshua McKinney
Code is under the Apache License 2.0