Skip to content

stephenc/junit-docker-rule

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Maven Central Build Status codecov.io

junit-docker-rule

Changelog

see changelog

What is it ?

Simple JUnit Rule starting docker container right for your test case:

package org.example;

import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertThat;

import java.io.IOException;
import org.apache.http.client.fluent.Request;
import org.junit.Rule;
import org.junit.Test;
import pl.domzal.junit.docker.rule.DockerRule;

public class HomepageExampleTest {

    @Rule
    public DockerRule container = DockerRule.builder() //
            .imageName("nginx") //
            .build();

    @Test
    public void shouldExposePorts() throws InterruptedException, IOException {

        // url container homepage will be exposed under
        String homepage = "http://"+container.getDockerHost()+":"+container.getExposedContainerPort("80")+"/";

        // use fluent apache http client to retrieve homepage content
        String pageContent = Request.Get(homepage).connectTimeout(1000).socketTimeout(1000).execute().returnContent().asString();

        // make sure this is indeed nginx welcome page
        assertThat(pageContent, containsString("Welcome to nginx!"));
    }

}

Container is started just before your test case and destroyed after.

It was created as side product and I'll be more than happy if you'll find it useful !

What docker options it currently supports ?

You can:

  • use it as JUnit @Rule or @ClassRule
  • specify image name/tag
  • specify container name (equivalent of command line --name)
  • define links to other containers (--link)
  • pass environment variables (--env or -e)
  • publish all exposed port to dynamically allocated host ports (--publish-all or -P)
  • publish specified container ports to specified host ports (-p - tcp or udp, no port ranges support yet)
  • mount host directory as a data volume (--volume or -v - also works for workstation dirs to boot2docker container with restriction that dir must be under user homedir)
  • specify extra /etc/hosts entries (--add-host)
  • access container stderr and stdout (forwarded to java System.err and System.out by default)
  • wait for message or sequence of messages in container output at container start

See usage examples in test cases.

Also - just type DockerRule.builder(). .. and try code assist in your favorite IDE (Alt-Enter in IDEA, Ctrl-Space in Eclipse) to see all possible options.

What do I need to use it ?

1. Install Docker (of course)

Docker should be installed and configured - which in general means you must have docker variables (DOCKER_HOST, DOCKER_MACHINE_NAME, ...) available in runtime. Preferred way to set them is via docker-machine command.

2. Declare dependency in pom.xml

...
<dependency>
    <groupId>com.github.tdomzal</groupId>
    <artifactId>junit-docker-rule</artifactId>
    <version>0.4</version>
    <scope>test</scope>
</dependency>
...

3. Use in test case

import pl.domzal.junit.docker.rule.DockerRule;

public class MyTestCase {
    ...
    @Rule
    public DockerRule testee = DockerRule.builder()
        .imageName("nginx")
        // ... other build options (try code assist from your IDE to explore available options)
        .build();
    ...
    // your test cases
}

What else should I know for now ?

  • It uses java docker client from Spotify
  • Build and tested with docker 1.9
  • This is work in progress (but all features are verified by tests)

How to use latest (SNAPSHOT) version

Change dependency to:

...
<dependency>
    <groupId>com.github.tdomzal</groupId>
    <artifactId>junit-docker-rule</artifactId>
    <version>0.5-SNAPSHOT</version>
    <scope>test</scope>
</dependency>
...

Add OSS Sonatype snapshot repository to you pom.xml:

<project>
    ...
    <repositories>
        ...
        <repository>
            <id>ossrh</id>
            <releases><enabled>false</enabled></releases>
            <snapshots><enabled>true</enabled></snapshots>
            <url>https://oss.sonatype.org/content/repositories/snapshots</url>
        </repository>
        ...
    </repositories>
    ...
</project>

How to build ?

Assuming you have apache maven installed it's just:

git clone https://github.com/tdomzal/junit-docker-rule.git
cd junit-docker-rule
mvn install -DskipTests

or, if you want to build with tests - substitute last command with:

mvn install

Of course test cases will run only if you have working docker environment.

About

Simple docker container starter as JUnit Rule

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Java 100.0%