Home Explore Blog CI



docker

1st chunk of `content/guides/java/run-tests.md`
51c8c73d6f2acf3bac70e5865424ae9f29b72091e92f1d800000000100000956
---
title: Run your Java tests
linkTitle: Run your tests
weight: 30
keywords: Java, build, test
description: How to build and run your Java tests
aliases:
  - /language/java/run-tests/
  - /guides/language/java/run-tests/
---

## Prerequisites

Complete all the previous sections of this guide, starting with [Containerize a Java application](containerize.md).

## Overview

Testing is an essential part of modern software development. Testing can mean a lot of things to different development teams. There are unit tests, integration tests and end-to-end testing. In this guide you'll take a look at running your unit tests in Docker.

### Multi-stage Dockerfile for testing

In the following example, you'll pull the testing commands into your Dockerfile.
Replace the contents of your Dockerfile with the following.

```dockerfile {hl_lines="3-19"}
# syntax=docker/dockerfile:1

FROM eclipse-temurin:21-jdk-jammy as base
WORKDIR /build
COPY --chmod=0755 mvnw mvnw
COPY .mvn/ .mvn/

FROM base as test
WORKDIR /build
COPY ./src src/
RUN --mount=type=bind,source=pom.xml,target=pom.xml \
    --mount=type=cache,target=/root/.m2 \
    ./mvnw test

FROM base as deps
WORKDIR /build
RUN --mount=type=bind,source=pom.xml,target=pom.xml \
    --mount=type=cache,target=/root/.m2 \
    ./mvnw dependency:go-offline -DskipTests

FROM deps as package
WORKDIR /build
COPY ./src src/
RUN --mount=type=bind,source=pom.xml,target=pom.xml \
    --mount=type=cache,target=/root/.m2 \
    ./mvnw package -DskipTests && \
    mv target/$(./mvnw help:evaluate -Dexpression=project.artifactId -q -DforceStdout)-$(./mvnw help:evaluate -Dexpression=project.version -q -DforceStdout).jar target/app.jar

FROM package as extract
WORKDIR /build
RUN java -Djarmode=layertools -jar target/app.jar extract --destination target/extracted

FROM extract as development
WORKDIR /build
RUN cp -r /build/target/extracted/dependencies/. ./
RUN cp -r /build/target/extracted/spring-boot-loader/. ./
RUN cp -r /build/target/extracted/snapshot-dependencies/. ./
RUN cp -r /build/target/extracted/application/. ./
ENV JAVA_TOOL_OPTIONS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000"
CMD [ "java", "-Dspring.profiles.active=postgres", "org.springframework.boot.loader.launch.JarLauncher" ]

FROM eclipse-temurin:21-jre-jammy AS final
ARG UID=10001
RUN adduser \
    --disabled-password \
    --gecos "" \

Title: Running Java Tests with Docker
Summary
This section guides you through running Java unit tests in Docker. It emphasizes the importance of testing in software development and provides a multi-stage Dockerfile example that includes a testing stage using Maven. The Dockerfile is structured to first set up a base image, then a test stage, followed by dependency management, packaging, extraction of layers, development setup, and finally a production-ready image.