DEV Community

Precious Chicken
Precious Chicken

Posted on • Originally published at preciouschicken.com on

Barebones Guide to JUnit on the Command Line

Introduction

JUnit is a testing framework for Java. It is primarily aimed for IDEs, but with some perseverance it can be used on the command line.

ConsoleLauncher

You will need ConsoleLauncher, a java executable, to run JUnit from the command line. At time of writing the latest version is junit-platform-console-standalone-1.6.0.jar and can be downloaded from the Maven Repository. Download this file to your working directory.

Create a sample java file

Using your text editor of choice create a file called SampleUnit.java and copy and paste the following code in it:

public class SampleUnit {

    public int addInts(int a, int b){
        return a + b;
    }

    public boolean validAboveZero(int a) {
        if (a>0) {
            return true;
        }
        return false;
    }
}

Enter fullscreen mode Exit fullscreen mode

Create a sample test file

Creating a file called SampleUnitTest.java copy the following:

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class SampleUnitTest {

    @Test
    public void testAddInts() {
        SampleUnit sampleUnit = new SampleUnit();
        int result = sampleUnit.addInts(2, 2);
    // The below should fail.
        assertEquals("Not adding correctly!", 5, result);
    }

    @Test
    public void testValidAboveZero() {
        SampleUnit sampleUnit = new SampleUnit();
        boolean result = sampleUnit.validAboveZero(2);
        assertTrue(result);
    }

    @Test
    public void testValidFail() {
        boolean result = false;
        assertFalse(result);
    }
}

Enter fullscreen mode Exit fullscreen mode

Compile

Run the following from the command line:

javac SampleUnit.java
javac -cp junit-platform-console-standalone-1.6.0.jar:. SampleUnitTest.java

Enter fullscreen mode Exit fullscreen mode

This assumes the JUnit jar, SampleUnit.java and SampleUnitTest.java are all in the same directory. The compiler will create two new files: SampleUnit.class and SampleUnitTest.class.

Run the tests

Finally at the command line run:

java -jar junit-platform-console-standalone-1.6.0.jar --class-path . -c SampleUnitTest

Enter fullscreen mode Exit fullscreen mode

This should output something like this:

Thanks for using JUnit! Support its development at https://junit.org/sponsoring

╷
├─ JUnit Jupiter ✔
└─ JUnit Vintage ✔
   └─ SampleUnitTest ✔
      ├─ testAddInts ✘ Not adding correctly! expected:<5> but was:<4>
      ├─ testValidFail ✔
      └─ testValidAboveZero ✔

Failures (1):
  JUnit Vintage:SampleUnitTest:testAddInts
    MethodSource [className = 'SampleUnitTest', methodName = 'testAddInts', methodParameterTypes = '']
    => java.lang.AssertionError: Not adding correctly! expected:<5> but was:<4>
       org.junit.Assert.fail(Assert.java:89)
       org.junit.Assert.failNotEquals(Assert.java:835)
       org.junit.Assert.assertEquals(Assert.java:647)
       SampleUnitTest.testAddInts(SampleUnitTest.java:13)
       java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
       java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
       java.base/java.lang.reflect.Method.invoke(Method.java:566)
       org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
       org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
       [...]

Test run finished after 43 ms
[3 containers found]
[0 containers skipped]
[3 containers started]
[0 containers aborted]
[3 containers successful]
[0 containers failed]
[3 tests found]
[0 tests skipped]
[3 tests started]
[0 tests aborted]
[2 tests successful]
[1 tests failed]

Enter fullscreen mode Exit fullscreen mode

ConsoleLauncher Options Frustration

The ConsoleLauncher has an extensive list of command line options for providing arguments. Above I’ve gone for --class-path . -c SampleUnitTest defined respectively as:

-cp, --classpath, --class-path=PATH[;|:PATH...] Provide additional classpath entries -- for example, for adding engines and their dependencies. This option can be repeated.
-c, --select-class=CLASS Select a class for test discovery. This option can be repeated.

Enter fullscreen mode Exit fullscreen mode

Why these two specifically? A simple reason - after a couple of hours reading stack overflow and trying various random combinations, it appears to be the only option I could get to work. This may be due to my incompetence, my setup (openjdk 11.0.6) or a bug.

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay