Skip to content

joshka/junit-json-params

Repository files navigation

junit-json-params

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

Library status

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.

Project Info

Maven Central Version Javadocs GitHub License
GitHub Actions Workflow Status Sonar Quality Gate Sonar Coverage

Installation

Apache Maven

<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>

Gradle

testImplementation 'net.joshka:junit-json-params:5.10.2-r0'
testImplementation 'org.eclipse.parsson:parsson:1.1.1'

Examples

@JsonSource

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

See JsonArgumentsProviderTest

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

@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");
    }
}

License

Copyright ©️ 2019-2024 Joshua McKinney

Code is under the Apache License 2.0

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy