BAEL-6812 Test Main Method with JUnit
- added sample to test main method with different architecture
This commit is contained in:
parent
63033cd8cf
commit
fd6b6aa6d5
|
@ -0,0 +1,2 @@
|
|||
### Relevant Articles:
|
||||
- [Test Main Method with JUnit](http://www.baeldung.com/junit-5)
|
|
@ -0,0 +1,60 @@
|
|||
<?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>
|
||||
<parent>
|
||||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>parent-modules</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>junit-5-basics-2</artifactId>
|
||||
|
||||
<dependencies>
|
||||
<!-- https://mvnrepository.com/artifact/commons-cli/commons-cli -->
|
||||
<dependency>
|
||||
<groupId>commons-cli</groupId>
|
||||
<artifactId>commons-cli</artifactId>
|
||||
<version>${commons-cli.version}</version>
|
||||
</dependency>
|
||||
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-api</artifactId>
|
||||
<version>${junit-jupiter-api.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-core -->
|
||||
<dependency>
|
||||
<groupId>org.mockito</groupId>
|
||||
<artifactId>mockito-core</artifactId>
|
||||
<version>${mockito-core.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
|
||||
</dependencies>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>11</source>
|
||||
<target>11</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>11</maven.compiler.source>
|
||||
<maven.compiler.target>11</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<commons-cli.version>1.5.0</commons-cli.version>
|
||||
<junit-jupiter-api.version>5.10.0</junit-jupiter-api.version>
|
||||
<mockito-core.version>5.4.0</mockito-core.version>
|
||||
</properties>
|
||||
|
||||
</project>
|
|
@ -0,0 +1,63 @@
|
|||
package com.baeldung.junit.main.test;
|
||||
|
||||
import org.apache.commons.cli.CommandLine;
|
||||
import org.apache.commons.cli.CommandLineParser;
|
||||
import org.apache.commons.cli.DefaultParser;
|
||||
import org.apache.commons.cli.Option;
|
||||
import org.apache.commons.cli.Options;
|
||||
import org.apache.commons.cli.ParseException;
|
||||
|
||||
public class Bootstrapper {
|
||||
private final InputReader inputReader;
|
||||
private final Calculator calculator;
|
||||
|
||||
public Bootstrapper(InputReader inputReader, Calculator calculator) {
|
||||
this.inputReader = inputReader;
|
||||
this.calculator = calculator;
|
||||
}
|
||||
|
||||
public void processRequest(String[] args) {
|
||||
try {
|
||||
Options options = getOptions();
|
||||
CommandLineParser parser = new DefaultParser();
|
||||
CommandLine commandLine = parser.parse(options, args);
|
||||
|
||||
if (commandLine.hasOption("i")) {
|
||||
System.out.print("Option i is present. The value is: " + commandLine.getOptionValue("i") + " \n");
|
||||
String optionValue = commandLine.getOptionValue("i");
|
||||
InputType inputType = InputType.valueOf(optionValue);
|
||||
|
||||
String fileName = null;
|
||||
if (commandLine.hasOption("f")) {
|
||||
fileName = commandLine.getOptionValue("f");
|
||||
}
|
||||
String inputString = inputReader.read(inputType, fileName);
|
||||
int calculatedSum = calculator.calculateSum(inputString);
|
||||
}
|
||||
|
||||
} catch (ParseException exception) {
|
||||
System.out.print("Parse error: " + exception.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public static Options getOptions() {
|
||||
Option fileNameOption = Option.builder("f")
|
||||
.required(false)
|
||||
.desc("The file name option")
|
||||
.type(String.class)
|
||||
.build();
|
||||
Option inputTypeOption = Option.builder("i")
|
||||
.longOpt("input")
|
||||
.required(true)
|
||||
.desc("The input type")
|
||||
.type(InputType.class)
|
||||
.hasArg()
|
||||
.build();
|
||||
|
||||
Options options = new Options();
|
||||
|
||||
options.addOption(inputTypeOption);
|
||||
options.addOption(fileNameOption);
|
||||
return options;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
package com.baeldung.junit.main.test;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
public class Calculator {
|
||||
|
||||
public int calculateSum(String input) {
|
||||
String[] array = input.split(" ");
|
||||
int sum = Arrays.stream(array)
|
||||
.map(Integer::valueOf)
|
||||
.mapToInt(Integer::intValue)
|
||||
.sum();
|
||||
System.out.println("Calculated sum: " + sum);
|
||||
return sum;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
package com.baeldung.junit.main.test;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.Scanner;
|
||||
|
||||
public class InputReader {
|
||||
|
||||
public String read(InputType inputType, String fileName) {
|
||||
switch (inputType) {
|
||||
case FILE:
|
||||
return readFromFile(fileName);
|
||||
case CONSOLE:
|
||||
return readFromConsole();
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private String readFromConsole() {
|
||||
System.out.println("Enter values for calculation: \n");
|
||||
String str = new Scanner(System.in).nextLine();
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
private String readFromFile(String fileName) {
|
||||
String readString = null;
|
||||
try {
|
||||
readString = Files.readString(Path.of(URI.create(fileName)));
|
||||
System.out.println(readString);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
package com.baeldung.junit.main.test;
|
||||
|
||||
public enum InputType {
|
||||
FILE, CONSOLE
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
package com.baeldung.junit.main.test;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
public class SimpleMain {
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
System.out.println("Received input parameters: " + Arrays.asList(args));
|
||||
|
||||
Bootstrapper bootstrapper = new Bootstrapper(new InputReader(), new Calculator());
|
||||
|
||||
bootstrapper.processRequest(args);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,118 @@
|
|||
package com.baeldung.junit.main.test;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.Arrays;
|
||||
import java.util.Scanner;
|
||||
|
||||
import org.apache.commons.cli.CommandLine;
|
||||
import org.apache.commons.cli.CommandLineParser;
|
||||
import org.apache.commons.cli.DefaultParser;
|
||||
import org.apache.commons.cli.Option;
|
||||
import org.apache.commons.cli.Options;
|
||||
import org.apache.commons.cli.ParseException;
|
||||
|
||||
public class StaticMain {
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
System.out.println("Received input parameters: " + Arrays.asList(args));
|
||||
|
||||
processRequest(args);
|
||||
}
|
||||
|
||||
public static void processRequest(String[] args) {
|
||||
try {
|
||||
Options options = getOptions();
|
||||
CommandLineParser parser = new DefaultParser();
|
||||
CommandLine commandLine = parser.parse(options, args);
|
||||
|
||||
if (commandLine.hasOption("V")) {
|
||||
System.out.print("Option V is present. The value is: ");
|
||||
System.out.println(commandLine.getOptionValue("V"));
|
||||
}
|
||||
|
||||
if (commandLine.hasOption("i")) {
|
||||
System.out.print("Option i is present. The value is: " + commandLine.getOptionValue("i") + " \n");
|
||||
String optionValue = commandLine.getOptionValue("i");
|
||||
InputType inputType = InputType.valueOf(optionValue);
|
||||
|
||||
String fileName = null;
|
||||
if (commandLine.hasOption("f")) {
|
||||
fileName = commandLine.getOptionValue("f");
|
||||
}
|
||||
String inputString = read(inputType, fileName);
|
||||
int calculatedSum = calculateSum(inputString);
|
||||
}
|
||||
|
||||
} catch (ParseException exception) {
|
||||
System.out.print("Parse error: ");
|
||||
System.out.println(exception.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public static Options getOptions() {
|
||||
|
||||
Option inputTypeOption = Option.builder("i")
|
||||
.longOpt("input")
|
||||
.required(true)
|
||||
.desc("The input type")
|
||||
.type(InputType.class)
|
||||
.hasArg()
|
||||
.build();
|
||||
Option fileNameOption = Option.builder("f")
|
||||
.required(false)
|
||||
.desc("The file name option")
|
||||
.type(String.class)
|
||||
.hasArg()
|
||||
.build();
|
||||
|
||||
Options options = new Options();
|
||||
|
||||
options.addOption(inputTypeOption);
|
||||
options.addOption(fileNameOption);
|
||||
return options;
|
||||
}
|
||||
|
||||
public static int calculateSum(String input) {
|
||||
if (input == null) {
|
||||
return 0;
|
||||
}
|
||||
String[] array = input.split(" ");
|
||||
int sum = Arrays.stream(array)
|
||||
.map(Integer::valueOf)
|
||||
.mapToInt(Integer::intValue)
|
||||
.sum();
|
||||
System.out.println("Calculated sum: " + sum);
|
||||
return sum;
|
||||
}
|
||||
|
||||
private static String readFromConsole() {
|
||||
System.out.println("Enter values for calculation: \n");
|
||||
return new Scanner(System.in).nextLine();
|
||||
}
|
||||
|
||||
private static String readFromFile(String fileName) {
|
||||
String readString = null;
|
||||
try {
|
||||
readString = Files.readString(Path.of(URI.create(fileName)));
|
||||
System.out.println(readString);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static String read(InputType inputType, String fileName) {
|
||||
switch (inputType) {
|
||||
case FILE:
|
||||
return readFromFile(fileName);
|
||||
case CONSOLE:
|
||||
return readFromConsole();
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,100 @@
|
|||
package com.baeldung.junit.main.test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.PrintStream;
|
||||
import java.nio.charset.Charset;
|
||||
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
public class TestSimpleMain {
|
||||
private InputStream defaultIn;
|
||||
private PrintStream defaultOut;
|
||||
|
||||
@BeforeEach
|
||||
public void setUp() {
|
||||
defaultIn = System.in;
|
||||
defaultOut = System.out;
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
public void tearDown() {
|
||||
System.setIn(defaultIn);
|
||||
System.setOut(defaultOut);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenArgumentAsConsoleInput_WhenReadFromSubstitutedByteStream_ThenSuccessfullyCalculate() throws IOException {
|
||||
String[] arguments = new String[] { "-i", "CONSOLE" };
|
||||
|
||||
final InputStream fips = new ByteArrayInputStream("1 2 3".getBytes());
|
||||
final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
|
||||
final PrintStream out = new PrintStream(byteArrayOutputStream);
|
||||
|
||||
System.setIn(fips);
|
||||
System.setOut(out);
|
||||
|
||||
//execute
|
||||
SimpleMain.main(arguments);
|
||||
|
||||
//verify
|
||||
String consoleOutput = byteArrayOutputStream.toString(Charset.defaultCharset());
|
||||
assertTrue(consoleOutput.contains("Calculated sum: 6"));
|
||||
|
||||
fips.close();
|
||||
out.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenArgumentAsConsoleInput_WhenReadFromSubstitutedFileStream_ThenSuccessfullyCalculate() throws IOException {
|
||||
String[] arguments = new String[] { "-i", "CONSOLE" };
|
||||
|
||||
final InputStream fips = getClass().getClassLoader()
|
||||
.getResourceAsStream("test-input.txt");
|
||||
final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
|
||||
final PrintStream out = new PrintStream(byteArrayOutputStream);
|
||||
|
||||
System.setIn(fips);
|
||||
System.setOut(out);
|
||||
|
||||
//execute
|
||||
SimpleMain.main(arguments);
|
||||
|
||||
//verify
|
||||
String consoleOutput = byteArrayOutputStream.toString(Charset.defaultCharset());
|
||||
assertTrue(consoleOutput.contains("Calculated sum: 10"));
|
||||
|
||||
fips.close();
|
||||
out.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenLongArgumentAsConsoleInput_WhenReadFromSubstitutedFileStream_ThenSuccessfullyCalculate() throws IOException {
|
||||
String[] arguments = new String[] { "--input", "CONSOLE" };
|
||||
|
||||
final InputStream fips = getClass().getClassLoader()
|
||||
.getResourceAsStream("test-input.txt");
|
||||
final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
|
||||
final PrintStream out = new PrintStream(byteArrayOutputStream);
|
||||
|
||||
System.setIn(fips);
|
||||
System.setOut(out);
|
||||
|
||||
//execute
|
||||
SimpleMain.main(arguments);
|
||||
|
||||
//verify
|
||||
String consoleOutput = byteArrayOutputStream.toString(Charset.defaultCharset());
|
||||
assertTrue(consoleOutput.contains("Calculated sum: 10"));
|
||||
|
||||
fips.close();
|
||||
out.close();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
package com.baeldung.junit.main.test;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.MockedStatic;
|
||||
import org.mockito.Mockito;
|
||||
|
||||
public class TestStaticMain {
|
||||
|
||||
@Test
|
||||
public void givenArgumentAsConsoleInput_WhenReadFromSubstitutedByteArrayInputStream_ThenSuccessfullyCalculate() throws IOException {
|
||||
String[] arguments = new String[] { "-i", "CONSOLE" };
|
||||
try (MockedStatic<StaticMain> mockedStatic = Mockito.mockStatic(StaticMain.class, Mockito.CALLS_REAL_METHODS);
|
||||
InputStream fips = new ByteArrayInputStream("1 2 3".getBytes())) {
|
||||
|
||||
final InputStream original = System.in;
|
||||
|
||||
//Reassigns the "standard" input stream
|
||||
System.setIn(fips);
|
||||
|
||||
ArgumentCaptor<String> stringArgumentCaptor = ArgumentCaptor.forClass(String.class);
|
||||
|
||||
//execute
|
||||
StaticMain.main(arguments);
|
||||
|
||||
//verify
|
||||
mockedStatic.verify(() -> StaticMain.calculateSum(stringArgumentCaptor.capture()));
|
||||
|
||||
System.setIn(original);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
4 5 1
|
|
@ -27,6 +27,7 @@
|
|||
<module>junit-4</module>
|
||||
<module>junit-5-advanced</module>
|
||||
<module>junit-5-basics</module>
|
||||
<module>junit-5-basics-2</module>
|
||||
<module>junit-5</module>
|
||||
<module>junit5-annotations</module>
|
||||
<module>junit5-migration</module>
|
||||
|
|
Loading…
Reference in New Issue