BAEL-4174: Java Modularity and Unit Testing (#13805)
* feat: Added two main modules * feat: Renamed test module * feat: Added scripts for compiling library modules * feat: Added scripts for running core module * feat: Added scripts for running test module * fix: Fixed module name * fix: Removed unnecessary module imports * feat: Added script for running tests with patch * fix: Remove unnecessary module path imports * feat: Script for simple classpath tests * fix: Updated output directory * fix: Updated output directory for test compilation * fix: Replace maven repository with local lib folder * feat: Add lib folder * feat: Update the scripts * fix: Remove pom from test module * fix: Update core pom dependencies * fix: Remove test module from a parent pom * fix: Removed jars and added a script * fix: Fix a script * fix: Fix pom conflict
This commit is contained in:
parent
fae3e80186
commit
c255eb13c1
|
@ -0,0 +1,2 @@
|
|||
#!/usr/bin/env bash
|
||||
javac -d mods/com.baeldung.library.core $(find library-core/src/main -name "*.java")
|
|
@ -0,0 +1,10 @@
|
|||
#!/usr/bin/env bash
|
||||
javac --class-path outDir/library-core/:\
|
||||
libs/junit-jupiter-engine-5.9.2.jar:\
|
||||
libs/junit-platform-engine-1.9.2.jar:\
|
||||
libs/apiguardian-api-1.1.2.jar:\
|
||||
libs/junit-jupiter-params-5.9.2.jar:\
|
||||
libs/junit-jupiter-api-5.9.2.jar:\
|
||||
libs/opentest4j-1.2.0.jar:\
|
||||
libs/junit-platform-commons-1.9.2.jar \
|
||||
-d outDir/library-test library-core/src/test/java/com/baeldung/library/core/LibraryUnitTest.java
|
|
@ -0,0 +1,13 @@
|
|||
#!/usr/bin/env bash
|
||||
javac --class-path libs/junit-jupiter-engine-5.9.2.jar:\
|
||||
libs/junit-platform-engine-1.9.2.jar:\
|
||||
libs/apiguardian-api-1.1.2.jar:\
|
||||
libs/junit-jupiter-params-5.9.2.jar:\
|
||||
libs/junit-jupiter-api-5.9.2.jar:\
|
||||
libs/opentest4j-1.2.0.jar:\
|
||||
libs/junit-platform-commons-1.9.2.jar \
|
||||
-d outDir/library-core \
|
||||
library-core/src/main/java/com/baeldung/library/core/Book.java \
|
||||
library-core/src/main/java/com/baeldung/library/core/Library.java \
|
||||
library-core/src/main/java/com/baeldung/library/core/Main.java \
|
||||
library-core/src/test/java/com/baeldung/library/core/LibraryUnitTest.java
|
|
@ -0,0 +1,12 @@
|
|||
#!/usr/bin/env bash
|
||||
javac --class-path libs/junit-jupiter-engine-5.9.2.jar:\
|
||||
libs/junit-platform-engine-1.9.2.jar:\
|
||||
libs/apiguardian-api-1.1.2.jar:\
|
||||
libs/junit-jupiter-params-5.9.2.jar:\
|
||||
libs/junit-jupiter-api-5.9.2.jar:\
|
||||
libs/opentest4j-1.2.0.jar:\
|
||||
libs/junit-platform-commons-1.9.2.jar \
|
||||
-d outDir/library-core \
|
||||
library-core/src/main/java/com/baeldung/library/core/Book.java \
|
||||
library-core/src/main/java/com/baeldung/library/core/Library.java \
|
||||
library-core/src/main/java/com/baeldung/library/core/Main.java
|
|
@ -0,0 +1,2 @@
|
|||
#!/usr/bin/env bash
|
||||
javac --module-path mods:libs -d mods/com.baeldung.library.test $(find library-test/src/test -name "*.java")
|
|
@ -0,0 +1,10 @@
|
|||
#!/usr/bin/env bash
|
||||
wget -P libs/ https://repo1.maven.org/maven2/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar /
|
||||
wget -P libs/ https://repo1.maven.org/maven2/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar /
|
||||
wget -P libs/ https://repo1.maven.org/maven2/org/junit/platform/junit-platform-commons/1.9.2/junit-platform-commons-1.9.2.jar /
|
||||
wget -P libs/ https://repo1.maven.org/maven2/org/junit/platform/junit-platform-engine/1.9.2/junit-platform-engine-1.9.2.jar /
|
||||
wget -P libs/ https://repo1.maven.org/maven2/org/junit/platform/junit-platform-reporting/1.9.2/junit-platform-reporting-1.9.2.jar /
|
||||
wget -P libs/ https://repo1.maven.org/maven2/org/junit/platform/junit-platform-console/1.9.2/junit-platform-console-1.9.2.jar /
|
||||
wget -P libs/ https://repo1.maven.org/maven2/org/junit/platform/junit-platform-launcher/1.9.2/junit-platform-launcher-1.9.2.jar /
|
||||
wget -P libs/ https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-engine/5.9.2/junit-jupiter-engine-5.9.2.jar /
|
||||
wget -P libs/ https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-params/5.9.2/junit-jupiter-params-5.9.2.jar
|
|
@ -0,0 +1,55 @@
|
|||
<?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>core-java-9-jigsaw</artifactId>
|
||||
<version>0.2-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>library-core</artifactId>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>19</maven.compiler.source>
|
||||
<maven.compiler.target>19</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-api</artifactId>
|
||||
<version>5.9.2</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-engine</artifactId>
|
||||
<version>5.9.2</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.8.1</version>
|
||||
<configuration>
|
||||
<release>9</release>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>3.0.0-M5</version>
|
||||
<configuration>
|
||||
<useModulePath>false</useModulePath>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
|
@ -0,0 +1,52 @@
|
|||
package com.baeldung.library.core;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class Book {
|
||||
|
||||
private String title;
|
||||
private String author;
|
||||
|
||||
public Book(String title, String author) {
|
||||
this.title = title;
|
||||
this.author = author;
|
||||
}
|
||||
|
||||
public String getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
public String getAuthor() {
|
||||
return author;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Book [title=" + title + ", author=" + author + "]";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
if (this == o) {
|
||||
return true;
|
||||
}
|
||||
if (o == null || getClass() != o.getClass()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
final Book book = (Book) o;
|
||||
|
||||
if (!Objects.equals(title, book.title)) {
|
||||
return false;
|
||||
}
|
||||
return Objects.equals(author, book.author);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result = title != null ? title.hashCode() : 0;
|
||||
result = 31 * result + (author != null ? author.hashCode() : 0);
|
||||
return result;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
package com.baeldung.library.core;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class Library {
|
||||
|
||||
private List<Book> books = new ArrayList<>();
|
||||
|
||||
public void addBook(Book book) {
|
||||
books.add(book);
|
||||
}
|
||||
|
||||
public List<Book> getBooks() {
|
||||
return books;
|
||||
}
|
||||
|
||||
void removeBook(Book book) {
|
||||
books.remove(book);
|
||||
}
|
||||
|
||||
protected void removeBookByAuthor(String author) {
|
||||
books.removeIf(book -> book.getAuthor().equals(author));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
package com.baeldung.library.core;
|
||||
|
||||
public class Main {
|
||||
|
||||
public static void main(String[] args) {
|
||||
Library library = new Library();
|
||||
library.addBook(new Book("The Lord of the Rings", "J.R.R. Tolkien"));
|
||||
library.addBook(new Book("The Hobbit", "J.R.R. Tolkien"));
|
||||
library.addBook(new Book("The Silmarillion", "J.R.R. Tolkien"));
|
||||
library.addBook(new Book("The Chronicles of Narnia", "C.S. Lewis"));
|
||||
library.addBook(new Book("The Lion, the Witch and the Wardrobe", "C.S. Lewis"));
|
||||
System.out.println("Welcome to our library!");
|
||||
System.out.println("We have the following books:");
|
||||
library.getBooks().forEach(System.out::println);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
module com.baeldung.library.core {
|
||||
exports com.baeldung.library.core;
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
package com.baeldung.library.core;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
class LibraryUnitTest {
|
||||
|
||||
@Test
|
||||
void givenEmptyLibrary_whenAddABook_thenLibraryHasOneBook() {
|
||||
Library library = new Library();
|
||||
Book theLordOfTheRings = new Book("The Lord of the Rings", "J.R.R. Tolkien");
|
||||
library.addBook(theLordOfTheRings);
|
||||
int expected = 1;
|
||||
int actual = library.getBooks().size();
|
||||
assertEquals(expected, actual);
|
||||
}
|
||||
|
||||
@Test
|
||||
void givenTheLibraryWithABook_whenRemoveABook_thenLibraryIsEmpty() {
|
||||
Library library = new Library();
|
||||
Book theLordOfTheRings = new Book("The Lord of the Rings", "J.R.R. Tolkien");
|
||||
library.addBook(theLordOfTheRings);
|
||||
library.removeBook(theLordOfTheRings);
|
||||
int expected = 0;
|
||||
int actual = library.getBooks().size();
|
||||
assertEquals(expected, actual);
|
||||
}
|
||||
|
||||
@Test
|
||||
void givenTheLibraryWithSeveralBook_whenRemoveABookByAuthor_thenLibraryHasNoBooksByTheAuthor() {
|
||||
Library library = new Library();
|
||||
Book theLordOfTheRings = new Book("The Lord of the Rings", "J.R.R. Tolkien");
|
||||
Book theHobbit = new Book("The Hobbit", "J.R.R. Tolkien");
|
||||
Book theSilmarillion = new Book("The Silmarillion", "J.R.R. Tolkien");
|
||||
Book theHungerGames = new Book("The Hunger Games", "Suzanne Collins");
|
||||
library.addBook(theLordOfTheRings);
|
||||
library.addBook(theHobbit);
|
||||
library.addBook(theSilmarillion);
|
||||
library.addBook(theHungerGames);
|
||||
library.removeBookByAuthor("J.R.R. Tolkien");
|
||||
int expected = 1;
|
||||
int actual = library.getBooks().size();
|
||||
assertEquals(expected, actual);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
package com.baeldung.library.test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import com.baeldung.library.core.Book;
|
||||
import com.baeldung.library.core.Library;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
class LibraryUnitTest {
|
||||
|
||||
@Test
|
||||
void givenEmptyLibrary_whenAddABook_thenLibraryHasOneBook() {
|
||||
Library library = new Library();
|
||||
Book theLordOfTheRings = new Book("The Lord of the Rings", "J.R.R. Tolkien");
|
||||
library.addBook(theLordOfTheRings);
|
||||
int expected = 1;
|
||||
int actual = library.getBooks().size();
|
||||
assertEquals(expected, actual);
|
||||
}
|
||||
|
||||
@Test
|
||||
void givenTheLibraryWithABook_whenRemoveABook_thenLibraryIsEmpty()
|
||||
throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
|
||||
Library library = new Library();
|
||||
Book theLordOfTheRings = new Book("The Lord of the Rings", "J.R.R. Tolkien");
|
||||
library.addBook(theLordOfTheRings);
|
||||
Method removeBook = Library.class.getDeclaredMethod("removeBook", Book.class);
|
||||
removeBook.setAccessible(true);
|
||||
removeBook.invoke(library, theLordOfTheRings);
|
||||
int expected = 0;
|
||||
int actual = library.getBooks().size();
|
||||
assertEquals(expected, actual);
|
||||
}
|
||||
@Test
|
||||
void givenTheLibraryWithSeveralBook_whenRemoveABookByAuthor_thenLibraryHasNoBooksByTheAuthor() {
|
||||
TestLibrary library = new TestLibrary();
|
||||
Book theLordOfTheRings = new Book("The Lord of the Rings", "J.R.R. Tolkien");
|
||||
Book theHobbit = new Book("The Hobbit", "J.R.R. Tolkien");
|
||||
Book theSilmarillion = new Book("The Silmarillion", "J.R.R. Tolkien");
|
||||
Book theHungerGames = new Book("The Hunger Games", "Suzanne Collins");
|
||||
library.addBook(theLordOfTheRings);
|
||||
library.addBook(theHobbit);
|
||||
library.addBook(theSilmarillion);
|
||||
library.addBook(theHungerGames);
|
||||
library.removeBookByAuthor("J.R.R. Tolkien");
|
||||
int expected = 1;
|
||||
int actual = library.getBooks().size();
|
||||
assertEquals(expected, actual);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
package com.baeldung.library.test;
|
||||
|
||||
import com.baeldung.library.core.Library;
|
||||
|
||||
public class TestLibrary extends Library {
|
||||
@Override
|
||||
public void removeBookByAuthor(final String author) {
|
||||
super.removeBookByAuthor(author);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
module com.baeldung.library.test {
|
||||
requires com.baeldung.library.core;
|
||||
requires org.junit.jupiter.api;
|
||||
opens com.baeldung.library.test to org.junit.platform.commons;
|
||||
}
|
|
@ -5,6 +5,10 @@
|
|||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>core-java-9-jigsaw</artifactId>
|
||||
<name>core-java-9-jigsaw</name>
|
||||
<packaging>pom</packaging>
|
||||
<modules>
|
||||
<module>library-core</module>
|
||||
</modules>
|
||||
|
||||
<parent>
|
||||
<groupId>com.baeldung</groupId>
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
#!/usr/bin/env bash
|
||||
java --module-path mods:libs \
|
||||
--add-modules com.baeldung.library.core \
|
||||
--add-opens com.baeldung.library.core/com.baeldung.library.core=org.junit.platform.commons \
|
||||
--add-reads com.baeldung.library.core=org.junit.jupiter.api \
|
||||
--patch-module com.baeldung.library.core=outDir/library-test \
|
||||
--module org.junit.platform.console --select-class com.baeldung.library.core.LibraryUnitTest
|
|
@ -0,0 +1,2 @@
|
|||
#!/usr/bin/env bash
|
||||
java --module-path mods --module com.baeldung.library.core/com.baeldung.library.core.Main
|
|
@ -0,0 +1,5 @@
|
|||
#!/usr/bin/env bash
|
||||
java --module-path libs \
|
||||
org.junit.platform.console.ConsoleLauncher \
|
||||
--classpath ./outDir/library-core \
|
||||
--select-class com.baeldung.library.core.LibraryUnitTest
|
|
@ -0,0 +1,5 @@
|
|||
#!/usr/bin/env bash
|
||||
java --module-path mods:libs \
|
||||
--add-modules com.baeldung.library.test \
|
||||
--add-opens com.baeldung.library.core/com.baeldung.library.core=com.baeldung.library.test \
|
||||
org.junit.platform.console.ConsoleLauncher --select-class com.baeldung.library.test.LibraryUnitTest
|
Loading…
Reference in New Issue