Java library for the Siren Hypermedia Type Specification

Related tags

Testing siren4j
Overview

This is a java library to help with the creation and use of
Hypermedia entities as specified by the Siren hypermedia specification. See https://github.com/kevinswiber/siren for more detail on the specification.

It contains classes to that represent the Siren components (Entity, Link, Action, Field). See: https://github.com/eserating/siren4j/wiki/Siren4J-Components

These can be easily built with a fluent builder API.

EXAMPLE BUILDER:
   
    // Create a new self Link
    Link selfLink = LinkBuilder.newInstance()
       .setRelationship(Link.RELATIONSHIP_SELF)
       .setHref("/self/link")
       .build();

    // Create a new Entity
    Entity result = EntityBuilder.newInstance()
       .setEntityClass("test")
       .addProperty("foo", "hello")
       .addProperty("number", 1)
       .addLink(selfLink)
       .build();

See: https://github.com/eserating/siren4j/wiki/Fluent-Builder-API

There is also a resource API that simplifies entity creation and management using reflection and annotations.

EXAMPLE RESOURCE:

@Siren4JEntity(name = "video", uri = "/videos/{id}")
public class Video extends BaseResource {
    
    private String id;    
    private String name;
    private String description;
    private String genre;
    private Rating rating;
    @Siren4JSubEntity(uri = "/video/{parent.id}/reviews", embeddedLink = true)
    private CollectionResource<Review> reviews;
            
    public String getId() {return id;}
    public void setId(String id) {this.id = id;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public String getDescription() {return description;}
    public void setDescription(String description) {this.description = description;}
    public String getGenre() {return genre;}
    public void setGenre(String genre) {this.genre = genre;}
    public Rating getRating() {return rating;}
    public void setRating(Rating rating) {this.rating = rating;}
    public CollectionResource<Review> getReviews() {return reviews;}
    public void setReviews(CollectionResource<Review> reviews) {this.reviews = reviews;}


    public enum Rating {G, PG, PG13, R, NR, X}

}

AN INSTANCE OF A RESOURCE CLASS CAN BE CONVERTED LIKE THIS:

    ResourceConverter converter = ReflectingConverter.newInstance();
    Entity videoEntity = converter.toEntity(videoResource);

AND WILL RESULT IN SIREN JSON THAT LOOKS LIKE THIS:

{
  "class":[
    "video"
  ],
  "properties":{
    "name":"Star Wars",
    "id":"z1977",
    "description":"An epic science fiction space opera",
    "genre":"scifi",
    "rating":"PG"
  },
  "entities":[
    {
      "class":[
        "siren4J.collectionResource",
        "collection"
      ],
      "rel":[
        "reviews"
      ],
      "href":"/video/z1977/reviews"
    }
  ],
  "links":[
    {
      "rel":[
        "self"
      ],
      "href":"/videos/z1977"
    }
  ]
}

See: https://github.com/eserating/siren4j/wiki/Siren4J-Resource-API

[http://wiki.siren4j.googlecode.com/hg/javadoc/index.html JavaDoc]

Note: This projects documentation is a work in progress.

Comments
  • Null Pointer at ReflectionTestUtils.java line number 528. Method name is

    Null Pointer at ReflectionTestUtils.java line number 528. Method name is "isSirenProperty"

    What steps will reproduce the problem?
    1. Try converting an annotated siren resource with a Map that has null key or 
    value
    2. Line 528 in RelectionTestUtils.java is checking for the .getClass().
    3. Results in a null pointer Exception.
    
    What is the expected output? What do you see instead?
    Null safe check should be done and output should have empty value or key. 
    Instead it is resulting in null pointer exception.
    
    What version of the product are you using? On what operating system?
    siren4j-1.0.14.jar
    
    Please provide any additional information below.
    All details are mentioned above
    
    

    Original issue reported on code.google.com by [email protected] on 2 Jul 2014 at 2:41

    auto-migrated Type-Defect Priority-Low 
    opened by GoogleCodeExporter 4
  • When the resource's overrideURI is set it is also replacing action and link uri's

    When the resource's overrideURI is set it is also replacing action and link uri's

    What steps will reproduce the problem?
    1.Set a value on the resource's overriderURI method 
    
    What is the expected output? What do you see instead?
    I would expect to only have the resources self link be overriden.
    But the actions and links are also having their uri overridden with the same 
    value.
    
    The problem is in the ReflectingConverters resolveURI code.
    
    
    

    Original issue reported on code.google.com by [email protected] on 20 May 2014 at 2:36

    auto-migrated Type-Defect Priority-Critical 
    opened by GoogleCodeExporter 4
  • Allow to skip missing properties for Entity -> Object convertion

    Allow to skip missing properties for Entity -> Object convertion

    What steps will reproduce the problem?
    1. Implement 2 classes: A and B. Let A has 2 properties prop1 and prop2 and B 
    only has prop1
    2. Serialize to string instance of class A with filled properties
    3. Try to deserialize json as class B
    
    What is the expected output? What do you see instead?
    I expect to successfully receive instance of class b with filled prop1, but 
    ReflectingConverter throws exception about missing prop2
    
    Please provide any additional information below.
    
    Current implementaiton is greatly reduces client flexibility in case of not 
    sharing common library with entities or implementing java client without 
    control of server side: any additional property breaks the code.
    
    There should be at least option to allow ignore such missing properties to be 
    able to construct "reduced" object.
    
    

    Original issue reported on code.google.com by zeldigas on 6 May 2014 at 7:57

    Priority-Medium auto-migrated Type-Defect 
    opened by GoogleCodeExporter 4
  • Can't output properties that are custom objects

    Can't output properties that are custom objects

    I've created my class with Siren4JEntity annotation and it extends BaseResource, but if my class have a field that's a reference type that's not a String it's not outputted to the produced representation obtained when used ReflectingConverter.newInstance().toEntity(), when according to the specification it should. Am I missing some annotation to produce that result, or is it not supported.

    opened by cedsan 3
  • Unset values no longer suppressed with Jackson 2.7.0

    Unset values no longer suppressed with Jackson 2.7.0

    Hi,

    when we upgraded one of our projects to Spring Boot 1.4 (that depends on Jackson 2.8.1), we found that a change in Jackson 2.7.0 relating to the handling of Include.NON_DEFAULT breaks the serialization of siren4j objects:

    If you annotate a field with @JsonInclude(Include.NON_DEFAULT) (as, for instance, in com.google.code.siren4j.component.impl.FieldImpl), then it is omitted from the serialized JSON only if it is "empty" or its value is the default value of the the fields type. It no longer matters how the default constructor of the class the field belongs to initializes the field.

    For the Siren4J fields this means that max, min, and maxLength are all serialized with -1 if you did not assign any values. Of course, -1 indicates the attribute was not set, so we don't want to see this in the serialized output. I came across this issue in FieldImpl, I did not check whether other Siren4J components are affected by this Jackson change as well.

    The attached unit tests demonstrates this issue: If you build it against Jackson 2.6.7, the test passes. If you build it agains Jackson 2.7.0, the test fails.

    Do you see an easy workaround or fix?

    Regards Christoph

    siren4jJackson.zip

    opened by chludwig-haufe 3
  • Update to org.reflections:reflection 0.9.10

    Update to org.reflections:reflection 0.9.10

    The method org.reflections.util.ClasspathHelper.forPackage had its return type changed from Set to Collection, causing a java.lang.NoSuchMethodError with the latest version. Using the older version causes the same in swagger-jaxrs.

    opened by jaxad0127 3
  • Preconfigured logging directory (/log/siren4j.log) causing problems

    Preconfigured logging directory (/log/siren4j.log) causing problems

    What steps will reproduce the problem?
    1. Including siren4j as a dependency in Grails (BuildConfig.groovy)
    2. Run "grails clean"
    3. FileNotFoundException because Siren4j is preconfigured to use 
    /log/siren4j.log for logging
    
    What is the expected output? What do you see instead?
    Siren should not be preconfigured to use a specific log appender
    
    What version of the product are you using? On what operating system?
    1.1.1 Mac OSX & Windows 7
    
    Please provide any additional information below.
    Here's the stacktrace:
    $ grails clean
    | Configuring classpath
    | Error log4j:ERROR setFile(null,true) call failed.
    | Error java.io.FileNotFoundException: /log/siren4j.log (No such file or 
    directory)
    | Error     at java.io.FileOutputStream.open(Native Method)
    | Error     at java.io.FileOutputStream.<init>(FileOutputStream.java:221)
    | Error     at java.io.FileOutputStream.<init>(FileOutputStream.java:142)
    | Error     at org.apache.log4j.FileAppender.setFile(FileAppender.java:294)
    | Error     at 
    org.apache.log4j.RollingFileAppender.setFile(RollingFileAppender.java:207)
    | Error     at org.apache.log4j.FileAppender.activateOptions(FileAppender.java:165)
    | Error     at 
    org.apache.log4j.config.PropertySetter.activate(PropertySetter.java:307)
    | Error     at 
    org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:172)
    | Error     at 
    org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:104)
    | Error     at 
    org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:84
    2)
    | Error     at 
    org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:76
    8)
    | Error     at 
    org.apache.log4j.PropertyConfigurator.parseCatsAndRenderers(PropertyConfigurator
    .java:672)
    | Error     at 
    org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:516)
    | Error     at 
    org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:580)
    | Error     at 
    org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java
    :526)
    | Error     at org.apache.log4j.LogManager.<clinit>(LogManager.java:127)
    | Error     at 
    org.apache.log4j.PropertyConfigurator.configure(PropertyConfigurator.java:415)
    | Error     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    | Error     at 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    | Error     at 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.jav
    a:43)
    | Error     at java.lang.reflect.Method.invoke(Method.java:606)
    | Error     at 
    org.codehaus.groovy.grails.cli.GrailsScriptRunner.initializeLogging(GrailsScript
    Runner.java:659)
    | Error     at 
    org.codehaus.groovy.grails.cli.GrailsScriptRunner.initializeState(GrailsScriptRu
    nner.java:631)
    | Error     at 
    org.codehaus.groovy.grails.cli.GrailsScriptRunner.callPluginOrGrailsScript(Grail
    sScriptRunner.java:414)
    | Error     at 
    org.codehaus.groovy.grails.cli.GrailsScriptRunner.executeCommand(GrailsScriptRun
    ner.java:379)
    | Error     at 
    org.codehaus.groovy.grails.cli.GrailsScriptRunner.main(GrailsScriptRunner.java:2
    26)
    | Error     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    | Error     at 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    | Error     at 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.jav
    a:43)
    | Error     at java.lang.reflect.Method.invoke(Method.java:606)
    | Error     at 
    org.codehaus.groovy.grails.cli.support.GrailsStarter.rootLoader(GrailsStarter.ja
    va:236)
    | Error     at 
    org.codehaus.groovy.grails.cli.support.GrailsStarter.main(GrailsStarter.java:264
    )
    | Application cleaned.
    
    
    

    Original issue reported on code.google.com by [email protected] on 30 Oct 2014 at 7:04

    Priority-Medium auto-migrated Type-Defect 
    opened by GoogleCodeExporter 3
  • Add support for media type in links

    Add support for media type in links

    Siren specification has been updated recently with the support of media type in 
    top-level links and links to embedded entities.
    
    It would be great to see this support in siren4j.
    
    

    Original issue reported on code.google.com by [email protected] on 20 Jul 2014 at 4:52

    Priority-Medium auto-migrated Type-Defect 
    opened by GoogleCodeExporter 3
  • ReflectingConverter does not support getters that aren't backed by a field

    ReflectingConverter does not support getters that aren't backed by a field

    I am building a POC to prove that I can support multiple output formats from 
    one service with minimal changes.  I am using both Spring HATEOAS and Siren as 
    my two test formats.  For all intents and purposes, the Resource objects that I 
    create are identical EXCEPT that for HATEOAS I need to extend ResourceSupport 
    and for Siren4j I need to extend BaseResource.
    
    As a result, I could end up with a lot of code duplication.  So I thought I 
    would extract the core object info into a delegate object.  Then each resource 
    would implement the same interface and use the delegate as the backing object.  
    Then the resources can have the same signature, but extend from two different 
    objects.
    
    The problem is that the ReflectingConverter calls 
    ReflectionUtils.getExposedFieldInfo(clazz) which only processes getter methods 
    if it can find the Field reference.  Further, the @Siren4JProperty annotation 
    only supports use on FIELD where as the @Siren4jPropertyIgnore supports both 
    FIELD and METHOD.
    
    I think that if @Siren4JProperty supported METHOD as well, then the 
    getExposedFieldInfo could be amplified to use the property as assigned to the 
    method or field.  You'd need to establish a priority in case someone put the 
    annotation in both places.
    
    What steps will reproduce the problem?
    1. Create a resource that extends BaseResource
    2. This resource should have getters that are not backed by class fields
    3. Attempt to RefelctingConverter.newInstance().toEntity(resource)
    
    What is the expected output? What do you see instead?
    I expect any non-ignored getter to be included in the property collection of 
    the Entity object.  None of the getters that do not have a field are 
    represented in the final Entity.
    
    What version of the product are you using? On what operating system?
    1.0.11
    jdk1.7.0_51 on Win7
    
    Please provide any additional information below.
    Here is a ridiculously simplified example.  Like I mentioned above, the purpose 
    would be to have another ErrorResource impl that extended ResourceSupport from 
    Spring HATEOAS.
    
    public interface IErrorResource {
        Integer getHttpStatusCode();
        void setHttpStatusCode(Integer httpStatusCode);
    }
    
    public class BaseErrorResource implements IErrorResource {
        private Integer httpStatusCode;
        @Override
        public Integer getHttpStatusCode() {
            return httpStatusCode;
        }
        @Override
        public void setHttpStatusCode(final Integer httpStatusCode) {
            this.httpStatusCode = httpStatusCode;
        }
    }
    
    @Siren4JInclude(Include.NON_EMPTY)
    @Siren4JEntity(name = "error")
    public class ErrorResource extends BaseResource implements IErrorResource {
        private final IErrorResource delegate = new BaseErrorResource();
    
        @Override
        public Integer getHttpStatusCode() {
            return delegate.getHttpStatusCode();
        }
        @Override
        public void setHttpStatusCode(final Integer httpStatusCode) {
            delegate.setHttpStatusCode(httpStatusCode);
        }
    }
    
    

    Original issue reported on code.google.com by [email protected] on 17 May 2014 at 12:30

    Priority-Medium auto-migrated Type-Defect 
    opened by GoogleCodeExporter 3
  • Add distinct static factory methods for builders

    Add distinct static factory methods for builders

    Current builders all have the same methods "newInstance" that does not allow to 
    fully utilize static method importing.
    
    It would be great to have distinct methods for each builder:
    LinkBuilder - aLink() (additional to newInstance())
    FieldBuilder - aField() (additional to newInstance())
    ....
    
    

    Original issue reported on code.google.com by zeldigas on 15 May 2014 at 1:31

    Priority-Medium auto-migrated Type-Defect 
    opened by GoogleCodeExporter 3
  • Allow omit baseUrl in links section

    Allow omit baseUrl in links section

    What steps will reproduce the problem?
    1. Set a base url to resource implementation and setFullyQualifiedLinks to true
    2. serialize object
    
    What is the expected output? What do you see instead?
    I expect that if fully qualified links is on and baseUrl is set then no link 
    with relation "baseUrl" is added to Entity object (and subentities) because 
    that information already present in each link.
    
    Currently it's not so and baseUrl is present in entity reqursively.
    
    Please provide any additional information below.
    I don't require that baseUrl will always be omitted in that scenario, but it 
    would be great to have an opportunity to setup converter for this.
    
    
    

    Original issue reported on code.google.com by zeldigas on 15 May 2014 at 10:35

    Priority-Medium auto-migrated Type-Defect 
    opened by GoogleCodeExporter 3
  • EntityBuilder: add a method addProperty that accept an object or json string

    EntityBuilder: add a method addProperty that accept an object or json string

    Hi, Is it possible to add a overloading method to addProperty of class com.google.code.siren4j.component.builder.EntityBuilder that accept a class object or a json string object?

    opened by sintetico82 0
  • Allow to use a pre-configured ObjectMapper

    Allow to use a pre-configured ObjectMapper

    At least for the Jackson part Siren4J should accept an pre-configured ObjectMapper, like it comes from a SpringBoot app.

    Beside from this, I ask myself is it really necessary to think so big and abstract from/duplicate Jackson ? Does Siren4J plan to be compatible with Jackson all the time and others too? Then it should not provide a subset of annotations and offer the full flexibility of those underlying implementations. Off topic here

    opened by openwms 0
  • ReflectingConverter does support type conversion

    ReflectingConverter does support type conversion

    Simple example to reproduce:
    1. Create a CollectionResource, set "total" property and serialize it to json 
    string
    2. Try to deserialized this string back to entity
    3. exception occurs about incorrect type
    
    The reason is that CollectionResource has total property of type long, but all 
    non fractioned numbers are deserialized as Integer. During assignment this 
    error occurs
    
    Dirty workaround for this problem is to subclass and define setter with int 
    type, but it's not a good solution
    
    Please perform type conversion for at least simplest cases (like described) or 
    use some existing solutions (for example Spring converters)
    

    Original issue reported on code.google.com by zeldigas on 6 May 2014 at 7:43

    Priority-Medium auto-migrated Type-Defect 
    opened by GoogleCodeExporter 6
  • Error: Sub entities are required to have a <rel> property set.

    Error: Sub entities are required to have a property set.

    There are no methods to create a <rel> property
    
    Issue can be created by using the fluent API. The following code will recreate 
    this issue:
    -----------------------------------------------
    EntityBuilder searchResult = EntityBuilder.newInstance()
           .setComponentClass("test")
           .addProperty("query", "queryText")
           .addProperty("timeSecs", 0.0001)
           .addProperty("productsScanned", 3)
           .addLink(LinkBuilder.newInstance()
                 .setRelationship(Link.RELATIONSHIP_SELF)
                 .setHref("/self/link")
                 .build());
    
    EntityBuilder resultItem1 = EntityBuilder.newInstance()
        .setComponentClass("resultItem")
        .addProperty("score", 9.9)
        .addProperty("docID", "9999ffff9999ffff")
        .setHref("href/dfas/");
    
    searchResult.addSubEntity(resultItem1.build());
    
    System.out.println(searchResult.build());
    -----------------------------------------------
    
    The method EntityBuilder.validateSubEntities()calls e.getRel() but there is no 
    way to setRel. Also there is no mechanism to set an href when you want an 
    embedded entity. Looking at the source, these methods live on EntityImpl. 
    
    Another issue is that this API does not seem to work when adding a single 
    sub-entity to a sub-entity. 
    
    
    
    

    Original issue reported on code.google.com by [email protected] on 19 Jan 2014 at 7:08

    Priority-Medium auto-migrated Type-Defect 
    opened by GoogleCodeExporter 1
Releases(siren4j-2.1.0)
  • siren4j-2.1.0(Mar 5, 2017)

    This release adds the ability to have 'urlParams' and 'headers' defined on an action. They use the same Siren4JActionField as the 'fields' do. But they are grouped as urlParams or headers to give clear functional separation as to what they are for.

    These are particularly useful for GET type actions. Allowing the server to provide the client with enough meta for the client to properly form a request complete with urlParams and headers.

    Example:

    @Siren4JAction( name = "addReview", 
    title = "Add a Review", method = Method.POST, 
    href = "/courseReviews/course/{courseid}", type = "application/json",
    condition = @Siren4JCondition(name = "somefield", logic=Is.TRUE), 
    fields = { @Siren4JActionField(name = "userid", type = "text",
     required = true ), 
    @Siren4JActionField(name = "body", 
    type = "text", required = true, maxLength = 250) } ,
    urlParams = { @Siren4JActionField(name = "filter-by", type = "text",
     required = true ) })
    

    Also added to an action is a metadata to allow custom data on an action as an associative array.

    metaData = {
                    @Siren4JMetaData(key = "actionExtraStuff1", value = "hello"),
                    @Siren4JMetaData(key = "actionExtraStuff2", value = "more stuff")
            }
    
    Source code(tar.gz)
    Source code(zip)
    siren4j-2.1.0-javadoc.jar(434.92 KB)
    siren4j-2.1.0-sources.jar(99.06 KB)
    siren4j-2.1.0.jar(87.69 KB)
  • siren4j-2.0.0(Feb 26, 2017)

    A getter type method can now be directly tagged as a Siren4JProperty without the need of having an actual property exist. This is particularly useful for calculated property values.

    Example:

    @Siren4JProperty
    public void getUniqueName() {
       // Do something to calculate name  
       return uniqueName
    }
    

    Will end up with a property named "uniqueName" in the "properties" or the Siren response JSON output.

    You can also override the name of the outputted property by specifying it in the annotation @Siren4JProperty('differentPropertyName')


    The types for the following properties in the Field object have changed

    • max, min, and maxLength were changed from int to Integer and the default value is now null
    • step is now a String instead of int, to accommodate the "any" possible value. This is a possible breaking change as consumers will need to deal with the conversion from string to the appropriate integer value. The default value is null.

    Fixes:

    • ReflectingConverter does not support getters that aren't backed by a field #11
    • Unset values no longer suppressed with Jackson 2.7.0 #27
    Source code(tar.gz)
    Source code(zip)
    siren4j-2.0.0-javadoc.jar(432.26 KB)
    siren4j-2.0.0-sources.jar(98.54 KB)
    siren4j-2.0.0.jar(86.82 KB)
  • siren4j-1.3.0(Jul 28, 2016)

  • siren4j-1.2.0(Mar 23, 2016)

Owner
Erik Serating
Erik Serating
A modern testing and behavioural specification framework for Java 8

Introduction If you're a Java developer and you've seen the fluent, modern specification frameworks available in other programming languages such as s

Richard Warburton 250 Sep 12, 2022
The Enterprise-ready testing and specification framework.

Spock Framework Spock is a BDD-style developer testing and specification framework for Java and Groovy applications. To learn more about Spock, visit

Spock Framework 3.3k Jan 5, 2023
fastjson auto type derivation search

Fastjson Auto Type Discovery and Visualization Blackhat USA 2021 Session ---- How I Used a JSON Deserialization 0day to Steal Your Money on the Blockc

RonnyX 17 Dec 9, 2022
A Java architecture test library, to specify and assert architecture rules in plain Java

ArchUnit is a free, simple and extensible library for checking the architecture of your Java code. That is, ArchUnit can check dependencies between pa

TNG Technology Consulting GmbH 2.5k Jan 2, 2023
Library that allows tests written in Java to follow the BDD style introduced by RSpec and Jasmine.

J8Spec J8Spec is a library that allows tests written in Java to follow the BDD style introduced by RSpec and Jasmine. More details here: j8spec.github

J8Spec 45 Feb 17, 2022
A library for setting up Java objects as test data.

Beanmother Beanmother helps to create various objects, simple and complex, super easily with fixtures for testing. It encourages developers to write m

Jaehyun Shin 113 Nov 7, 2022
Testcontainers is a Java library that supports JUnit tests, providing lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container.

Testcontainers Testcontainers is a Java library that supports JUnit tests, providing lightweight, throwaway instances of common databases, Selenium we

null 6.7k Jan 9, 2023
Roman Beskrovnyi 248 Dec 21, 2022
Playwright is a Java library to automate Chromium, Firefox and WebKit with a single API.

Playwright is a Java library to automate Chromium, Firefox and WebKit with a single API. Playwright is built to enable cross-browser web automation that is ever-green, capable, reliable and fast.

Microsoft 634 Jan 8, 2023
Fluent assertions library for Java

Deep Dive Assertions Deep Dive is an assertion library for Java. It offers a fluent API which allows you to dive deep, i.e. going back and forth betwe

Johannes Döbler 6 Jan 24, 2022
Advanced Java library for integration testing, mocking, faking, and code coverage

Codebase for JMockit 1.x releases - Documentation - Release notes How to build the project: use JDK 1.8 or newer use Maven 3.6.0 or newer; the followi

The JMockit Testing Toolkit 439 Dec 9, 2022
AllPairs4J - an open source Java library for generation of minimal set of test combinations

AllPairs4J AllPairs4J is an open source Java library for generation of minimal set of test combinations. AllPairs4J is a Java port of allpairspy proje

Pavel Nazimok 5 Dec 11, 2022
Yet another Java annotation-based command parsing library, with Dependency Injection inspired by Guice

Commander A universal java command parsing library Building This project uses Gradle. Clone this repository: git clone https://github.com/OctoPvP/Comm

OctoDev 4 Oct 2, 2022
Serenity BDD is a test automation library designed to make writing automated acceptance tests easier, and more fun.

That feeling you get when you know you can trust your tests Serenity BDD is a library designed to make writing automated acceptance tests easier, and

Serenity BDD 654 Dec 28, 2022
AssertJ is a library providing easy to use rich typed assertions

AssertJ - Fluent assertions for java AssertJ provides a rich and intuitive set of strongly-typed assertions to use for unit testing (with JUnit, TestN

AssertJ 2.3k Dec 30, 2022
CodeSheriff is a simple library that helps you in writing JUnit tests that check the quality of your code

CodeSheriff is a simple library that helps you in writing JUnit tests that check the quality of your code. For example, CodeSheriff may fail because you have methods in your code that have more than X lines of code, or that have complexity greater than Y.

Maurício Aniche 62 Feb 10, 2022
🔌 Simple library to manipulate HTTP requests/responses and capture network logs made by the browser using selenium tests without using any proxies

Simple library to manipulate HTTP requests and responses, capture the network logs made by the browser using selenium tests without using any proxies

Sudharsan Selvaraj 29 Oct 23, 2022
Objenesis is a library dedicated to bypass the constructor when creating an object. On any JVM there is.

Objenesis Objenesis is a library dedicated to bypass the constructor when creating an object. On any JVM there is. You can find the website and user d

EasyMock 532 Jan 2, 2023
AssertJ is a library providing easy to use rich typed assertions

AssertJ - Fluent assertions for java AssertJ provides a rich and intuitive set of strongly-typed assertions to use for unit testing (with JUnit, TestN

AssertJ 2.3k Jan 8, 2023