1

I am designing a program that has to run with the mvn test command and take a user input from the command line. When I run the program with mvn test everything works until Scanner.next() is executed, then the CLI hangs and I have to close the program.

my test method
    public class AppTest 
{
    @Test
    public void shouldAnswerWithTrue()
    {
        Scanner sc = new Scanner(System.in);
        System.out.println("Awaiting input");
        String in = sc.next();
        System.out.println("TEST!" + in);
        assertTrue( true );
    }
}

my pom.xml

    <?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>my-app</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
        <plugin>
               <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <configuration>
                    <mainClass>com.vogella.build.maven.intro.Main</mainClass>
                </configuration>
            </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

Is it possible to handle the input this way with the Scanner class? Or at all through the maven command line interface in this way?

Kate Orlova
  • 3,225
  • 5
  • 11
  • 35
ZhengLi
  • 11
  • 4

1 Answers1

0

As far as I know you can't use Scanner as part of any code via Maven. Maven is to help you build, test, deploy - not actually help you at runtime. Furthermore, typically speaking, a unit test shouldn't rely on input at runtime.

Solution 1: Run the jUnit test directly with Java from command line
java -cp .:/usr/share/java/junit.jar org.junit.runner.JUnitCore AppTest

More information here.

Solution 2: Use system properties
You can then use System.getProperty("myVariable");
which you would run as mvn -Dtest=shouldAnswerWithTrue -DargLine="-myVariable=abc"

See more information about this method here.

CeePlusPlus
  • 803
  • 1
  • 7
  • 26
  • Is there anyway to run the maven application main from command line and have it pause for user input? that's really the functionality I need. – ZhengLi Sep 24 '19 at 18:39
  • To my knowledge no. But I suspect you are misunderstanding what maven is. In practical terms there is no such thing called a "maven application". There is a Java application, and the maven tool. Maven helps you prepare your Java application, its not meant to run it. If your only goal is to run this, then you need something like solution 1 where you are just running the Java code. – CeePlusPlus Sep 24 '19 at 18:45