diff --git a/httpclient-2/pom.xml b/httpclient-2/pom.xml index a6b2ede900..85fc1d87e7 100644 --- a/httpclient-2/pom.xml +++ b/httpclient-2/pom.xml @@ -43,6 +43,12 @@ ${spring-boot.version} test + + + org.springframework.boot + spring-boot-starter-webflux + ${spring-boot.version} + diff --git a/httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/SpringWebClientUnitTest.java b/httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/SpringWebClientUnitTest.java new file mode 100644 index 0000000000..9bd2f825ad --- /dev/null +++ b/httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/SpringWebClientUnitTest.java @@ -0,0 +1,17 @@ +package com.baeldung.httpclient.readresponsebodystring; + +import org.junit.Test; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +public class SpringWebClientUnitTest { + public static final String DUMMY_URL = "https://postman-echo.com/get"; + + @Test + public void whenUseWebClientRetrieve_thenCorrect() { + WebClient webClient = WebClient.create(DUMMY_URL); + Mono body = webClient.get().retrieve().bodyToMono(String.class); + String s = body.block(); + System.out.println(s); + } +} diff --git a/libraries-6/pom.xml b/libraries-6/pom.xml index 289597adc9..8d05d2013c 100644 --- a/libraries-6/pom.xml +++ b/libraries-6/pom.xml @@ -123,9 +123,9 @@ - bedatadriven - bedatadriven public repo - https://nexus.bedatadriven.com/content/groups/public/ + mulesoft + Mulesoft Repository + https://repository.mulesoft.org/nexus/content/repositories/public/ diff --git a/libraries-io/pom.xml b/libraries-io/pom.xml index 2f65fd989b..0cea9ae9ac 100644 --- a/libraries-io/pom.xml +++ b/libraries-io/pom.xml @@ -29,6 +29,11 @@ commons-vfs2 ${vfs.version} + + net.lingala.zip4j + zip4j + 2.9.0 + diff --git a/libraries-io/src/main/java/com/baeldung/java/io/zip4j/CreateSplitZipFile.java b/libraries-io/src/main/java/com/baeldung/java/io/zip4j/CreateSplitZipFile.java new file mode 100644 index 0000000000..cc39bc9dd2 --- /dev/null +++ b/libraries-io/src/main/java/com/baeldung/java/io/zip4j/CreateSplitZipFile.java @@ -0,0 +1,22 @@ +package com.baeldung.java.io.zip4j; + +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; +import net.lingala.zip4j.model.ZipParameters; +import net.lingala.zip4j.model.enums.EncryptionMethod; + +import java.io.File; +import java.util.Arrays; + +public class CreateSplitZipFile { + + public static void main(String[] args) throws ZipException { + ZipParameters zipParameters = new ZipParameters(); + zipParameters.setEncryptFiles(true); + zipParameters.setEncryptionMethod(EncryptionMethod.AES); + ZipFile zipFile = new ZipFile("compressed.zip", "password".toCharArray()); + int splitLength = 1024 * 1024 * 10; //10MB + zipFile.createSplitZipFile(Arrays.asList(new File("aFile.txt")), zipParameters, true, splitLength); + zipFile.createSplitZipFileFromFolder(new File("/users/folder_to_add"), zipParameters, true, splitLength); + } +} diff --git a/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ExtractAllFile.java b/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ExtractAllFile.java new file mode 100644 index 0000000000..10e7ddd339 --- /dev/null +++ b/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ExtractAllFile.java @@ -0,0 +1,12 @@ +package com.baeldung.java.io.zip4j; + +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; + +public class ExtractAllFile { + + public static void main(String[] args) throws ZipException { + ZipFile zipFile = new ZipFile("compressed.zip", "password".toCharArray()); + zipFile.extractAll("/destination_directory"); + } +} diff --git a/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ExtractSingleFile.java b/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ExtractSingleFile.java new file mode 100644 index 0000000000..4cf466d02b --- /dev/null +++ b/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ExtractSingleFile.java @@ -0,0 +1,12 @@ +package com.baeldung.java.io.zip4j; + +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; + +public class ExtractSingleFile { + + public static void main(String[] args) throws ZipException { + ZipFile zipFile = new ZipFile("compressed.zip", "password".toCharArray()); + zipFile.extractFile("aFile.txt", "/destination_directory"); + } +} diff --git a/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ZipFolder.java b/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ZipFolder.java new file mode 100644 index 0000000000..4d89e8665f --- /dev/null +++ b/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ZipFolder.java @@ -0,0 +1,19 @@ +package com.baeldung.java.io.zip4j; + +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; +import net.lingala.zip4j.model.ZipParameters; +import net.lingala.zip4j.model.enums.EncryptionMethod; + +import java.io.File; + +public class ZipFolder { + + public static void main(String[] args) throws ZipException { + ZipParameters zipParameters = new ZipParameters(); + zipParameters.setEncryptFiles(true); + zipParameters.setEncryptionMethod(EncryptionMethod.AES); + ZipFile zipFile = new ZipFile("compressed.zip", "password".toCharArray()); + zipFile.addFolder(new File("/users/folder_to_add"), zipParameters); + } +} diff --git a/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ZipMultiFile.java b/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ZipMultiFile.java new file mode 100644 index 0000000000..dcb860ef92 --- /dev/null +++ b/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ZipMultiFile.java @@ -0,0 +1,27 @@ +package com.baeldung.java.io.zip4j; + +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; +import net.lingala.zip4j.model.ZipParameters; +import net.lingala.zip4j.model.enums.EncryptionMethod; + +import java.io.File; +import java.util.Arrays; +import java.util.List; + +public class ZipMultiFile { + + public static void main(String[] args) throws ZipException { + ZipParameters zipParameters = new ZipParameters(); + zipParameters.setEncryptFiles(true); + zipParameters.setEncryptionMethod(EncryptionMethod.AES); + + List filesToAdd = Arrays.asList( + new File("aFile.txt"), + new File("bFile.txt") + ); + + ZipFile zipFile = new ZipFile("compressed.zip", "password".toCharArray()); + zipFile.addFiles(filesToAdd, zipParameters); + } +} diff --git a/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ZipSingleFile.java b/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ZipSingleFile.java new file mode 100644 index 0000000000..a5f600df47 --- /dev/null +++ b/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ZipSingleFile.java @@ -0,0 +1,21 @@ +package com.baeldung.java.io.zip4j; + +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; +import net.lingala.zip4j.model.ZipParameters; +import net.lingala.zip4j.model.enums.CompressionLevel; +import net.lingala.zip4j.model.enums.EncryptionMethod; + +import java.io.File; + +public class ZipSingleFile { + + public static void main(String[] args) throws ZipException { + ZipParameters zipParameters = new ZipParameters(); + zipParameters.setEncryptFiles(true); + zipParameters.setCompressionLevel(CompressionLevel.HIGHER); + zipParameters.setEncryptionMethod(EncryptionMethod.AES); + ZipFile zipFile = new ZipFile("compressed.zip", "password".toCharArray()); + zipFile.addFile(new File("aFile.txt")); + } +} diff --git a/maven-modules/host-maven-repo-example/pom.xml b/maven-modules/host-maven-repo-example/pom.xml new file mode 100644 index 0000000000..9434e4a3b3 --- /dev/null +++ b/maven-modules/host-maven-repo-example/pom.xml @@ -0,0 +1,108 @@ + + + 4.0.0 + + com.baeldung.maven.plugin + host-maven-repo-example + 1.0-SNAPSHOT + + https://github.com/sgrverma23/host-maven-repo-example.git + + + github + 8 + 8 + + + + https://github.com/sgrverma23/host-maven-repo-example.git + scm:git:git@github.com:sgrverma23/host-maven-repo-example.git + scm:git:git@github.com:sgrverma23/host-maven-repo-example.git + + + + + + internal.repo + Temporary Staging Repository + file://${project.build.directory}/mvn-artifact + + + + + + org.apache.maven.plugins + maven-source-plugin + 3.1.0 + + + attach-sources + + jar + + + + + + com.github.github + site-maven-plugin + 0.12 + + Maven artifacts for ${project.version} + true + ${project.build.directory} + refs/heads/main + + **/* + + true + host-maven-repo-example + sgrverma23 + github + + + + + site + + deploy + + + + + maven-deploy-plugin + 2.8.2 + + + internal.repo::default::file://${project.build.directory}/mvn-artifact + + + + + org.apache.maven.plugins + maven-source-plugin + 3.1.0 + + + attach-sources + + jar + + + + + + + + + PROJECT-REPO-URL + https://github.com/sgrverma23/host-maven-repo-example/main + + true + always + + + + \ No newline at end of file diff --git a/maven-modules/host-maven-repo-example/src/java/com/baeldung/maven/plugin/MainApp.java b/maven-modules/host-maven-repo-example/src/java/com/baeldung/maven/plugin/MainApp.java new file mode 100644 index 0000000000..521606313c --- /dev/null +++ b/maven-modules/host-maven-repo-example/src/java/com/baeldung/maven/plugin/MainApp.java @@ -0,0 +1,7 @@ +package com.baeldung.maven.plugin; + +public class MainApp { + public static void main(String[] args){ + System.out.println("Maven Repo Add"); + } +} diff --git a/maven-modules/pom.xml b/maven-modules/pom.xml index 0700c6e637..9fc201f46d 100644 --- a/maven-modules/pom.xml +++ b/maven-modules/pom.xml @@ -33,6 +33,7 @@ versions-maven-plugin maven-printing-plugins maven-builder-plugin + host-maven-repo-example plugin-management diff --git a/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvc/MvcMainClass.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvc/MvcMainClass.java new file mode 100644 index 0000000000..9ccd4ee74c --- /dev/null +++ b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvc/MvcMainClass.java @@ -0,0 +1,24 @@ +package com.baeldung.mvc_mvp.mvc; + +public class MvcMainClass { + + public static void main(String[] args) { + + Product model = retrieveProductFromDatabase(); + ProductView view = new ProductView(); + model.setView(view); + model.showProduct(); + + ProductController controller = new ProductController(model); + controller.setName("SmartPhone"); + model.showProduct(); + } + + private static Product retrieveProductFromDatabase() { + Product product = new Product(); + product.setName("Mobile"); + product.setDescription("New Brand"); + product.setPrice(1000.0); + return product; + } +} diff --git a/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvc/Product.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvc/Product.java new file mode 100644 index 0000000000..5c44d4475a --- /dev/null +++ b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvc/Product.java @@ -0,0 +1,45 @@ +package com.baeldung.mvc_mvp.mvc; + +public class Product { + private String name; + private String description; + private Double price; + private ProductView view; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Double getPrice() { + return price; + } + + public void setPrice(Double price) { + this.price = price; + } + + public ProductView getView() { + return view; + } + + public void setView(ProductView view) { + this.view = view; + } + + public void showProduct() { + view.printProductDetails(name, description, price); + } + +} diff --git a/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvc/ProductController.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvc/ProductController.java new file mode 100644 index 0000000000..62cdb76f23 --- /dev/null +++ b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvc/ProductController.java @@ -0,0 +1,34 @@ +package com.baeldung.mvc_mvp.mvc; + +public class ProductController { + private final Product product; + + public ProductController(Product product) { + this.product = product; + } + + public String getName() { + return product.getName(); + } + + public void setName(String name) { + product.setName(name); + } + + public String getDescription() { + return product.getDescription(); + } + + public void setDescription(String description) { + product.setDescription(description); + } + + public Double getPrice() { + return product.getPrice(); + } + + public void setPrice(Double price) { + product.setPrice(price); + } + +} diff --git a/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvc/ProductView.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvc/ProductView.java new file mode 100644 index 0000000000..43f45b6df7 --- /dev/null +++ b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvc/ProductView.java @@ -0,0 +1,15 @@ +package com.baeldung.mvc_mvp.mvc; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ProductView { + private static Logger log = LoggerFactory.getLogger(ProductView.class); + + public void printProductDetails(String name, String description, Double price) { + log.info("Product details:"); + log.info("product Name: " + name); + log.info("product Description: " + description); + log.info("product price: " + price); + } +} diff --git a/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvp/MvpMainClass.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvp/MvpMainClass.java new file mode 100644 index 0000000000..7d12a0142c --- /dev/null +++ b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvp/MvpMainClass.java @@ -0,0 +1,22 @@ +package com.baeldung.mvc_mvp.mvp; + +public class MvpMainClass { + + public static void main(String[] args) { + + Product model = retrieveProductFromDatabase(); + ProductView view = new ProductView(); + ProductPresenter presenter = new ProductPresenter(model, view); + presenter.showProduct(); + presenter.setName("SmartPhone"); + presenter.showProduct(); + } + + private static Product retrieveProductFromDatabase() { + Product product = new Product(); + product.setName("Mobile"); + product.setDescription("New Brand"); + product.setPrice(1000.0); + return product; + } +} diff --git a/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvp/Product.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvp/Product.java new file mode 100644 index 0000000000..315e6e69b6 --- /dev/null +++ b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvp/Product.java @@ -0,0 +1,32 @@ +package com.baeldung.mvc_mvp.mvp; + +public class Product { + private String name; + private String description; + private Double price; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Double getPrice() { + return price; + } + + public void setPrice(Double price) { + this.price = price; + } + +} diff --git a/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvp/ProductPresenter.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvp/ProductPresenter.java new file mode 100644 index 0000000000..2b87bdbbb5 --- /dev/null +++ b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvp/ProductPresenter.java @@ -0,0 +1,40 @@ +package com.baeldung.mvc_mvp.mvp; + +public class ProductPresenter { + private final Product product; + private final ProductView view; + + public ProductPresenter(Product product, ProductView view) { + this.product = product; + this.view = view; + } + + public String getName() { + return product.getName(); + } + + public void setName(String name) { + product.setName(name); + } + + public String getDescription() { + return product.getDescription(); + } + + public void setDescription(String description) { + product.setDescription(description); + } + + public Double getProductPrice() { + return product.getPrice(); + } + + public void setPrice(Double price) { + product.setPrice(price); + } + + public void showProduct() { + view.printProductDetails(product.getName(), product.getDescription(), product.getPrice()); + } + +} diff --git a/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvp/ProductView.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvp/ProductView.java new file mode 100644 index 0000000000..27ccc6743d --- /dev/null +++ b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvp/ProductView.java @@ -0,0 +1,15 @@ +package com.baeldung.mvc_mvp.mvp; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ProductView { + private static Logger log = LoggerFactory.getLogger(ProductView.class); + + public void printProductDetails(String name, String description, Double price) { + log.info("Product details:"); + log.info("product Name: " + name); + log.info("product Description: " + description); + log.info("product price: " + price); + } +} diff --git a/persistence-modules/core-java-persistence-2/src/main/java/com/baeldung/jdbcautocommit/Person.java b/persistence-modules/core-java-persistence-2/src/main/java/com/baeldung/jdbcautocommit/Person.java new file mode 100644 index 0000000000..81c60a0db1 --- /dev/null +++ b/persistence-modules/core-java-persistence-2/src/main/java/com/baeldung/jdbcautocommit/Person.java @@ -0,0 +1,51 @@ +package com.baeldung.jdbcautocommit; + +public class Person { + + private Integer id; + private String name; + private String lastName; + private Integer age; + + public Person() { + } + + public Person(Integer id, String name, String lastName, Integer age) { + this.id = id; + this.name = name; + this.lastName = lastName; + this.age = age; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } +} diff --git a/persistence-modules/core-java-persistence-2/src/test/java/com/baeldung/jdbcautocommit/AutoCommitUnitTest.java b/persistence-modules/core-java-persistence-2/src/test/java/com/baeldung/jdbcautocommit/AutoCommitUnitTest.java new file mode 100644 index 0000000000..a3e3d8f34c --- /dev/null +++ b/persistence-modules/core-java-persistence-2/src/test/java/com/baeldung/jdbcautocommit/AutoCommitUnitTest.java @@ -0,0 +1,259 @@ +package com.baeldung.jdbcautocommit; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +public class AutoCommitUnitTest { + + private static final String INSERT_PERSON_SQL = "INSERT INTO Person VALUES (?,?,?,?)"; + private static final String SELECT_ALL_PEOPLE_SQL = "SELECT * FROM Person"; + private static final String UPDATE_PERSON_AGE_BY_ID_SQL = "UPDATE Person SET age = ? WHERE id = ?"; + private static final String DELETE_ALL_PEOPLE_SQL = "DELETE FROM Person"; + private static final String UPDATE_PERSON_AGE_BY_NAME_SQL + = "UPDATE Person SET age = ? WHERE id = (SELECT id FROM Person WHERE name = ?)"; + private static final String CREATE_PERSON_TABLE_SQL + = "CREATE TABLE Person (id INTEGER not null, name VARCHAR(50), lastName VARCHAR(50), age INTEGER, PRIMARY KEY (id))"; + + private static Connection connection1; + private static Connection connection2; + + @BeforeAll + static void setup() throws SQLException { + connection1 = DriverManager.getConnection("jdbc:h2:mem:autocommit", "sa", ""); + createPersonTable(connection1); + + connection2 = DriverManager.getConnection("jdbc:h2:mem:autocommit", "sa", ""); + } + + @Test + void givenAutoCommitTrue_whenInsertAndUpdateRecord_thenDataPersistedAfterEachWithoutCommit() throws SQLException { + + connection1.setAutoCommit(true); + + Person person = new Person(1, "John", "Doe", 45); + insertPerson(connection1, person); + + // no explicit commit needed here when auto-commit true + + // viewed from different connection, connection2 : assert person has been persisted into + // the database + List people = selectAllPeople(connection2); + assertThat("person record inserted OK into empty table", people.size(), is(equalTo(1))); + Person personInserted = people.iterator().next(); + assertThat("id correct", personInserted.getId(), is(equalTo(1))); + + // update age for person in database + updatePersonAgeById(connection1, 1, 65); + + // no explicit commit needed here + + // viewed from connection2 : assert person's age has been updated to database + people = selectAllPeople(connection2); + Person personUpdated = people.iterator().next(); + assertThat("updated age correct", personUpdated.getAge(), is(equalTo(65))); + } + + @Test + void givenAutoCommitFalse_whenInsertCommitAndUpdateCommit_thenDataViewableAfterEachCommit() throws SQLException { + + connection1.setAutoCommit(false); + + Person person = new Person(1, "John", "Doe", 45); + insertPerson(connection1, person); + + // viewed from different connection, connection2 : assert that person has not yet been + // persisted to database before issuing commit + List people = selectAllPeople(connection2); + assertThat("No people have been inserted into database yet", people.size(), is(equalTo(0))); + + connection1.commit(); + + // viewed from connection2 : assert that person has been persisted to database after + // issuing commit + people = selectAllPeople(connection2); + assertThat("Person has been inserted into empty table after commit", people.size(), is(equalTo(1))); + Person personInserted = people.iterator().next(); + assertThat("id correct", personInserted.getId(), is(equalTo(1))); + + updatePersonAgeById(connection1, 1, 65); + + // assert that person's age has not been updated before issuing commit + people = selectAllPeople(connection2); + Person personUpdated = people.iterator().next(); + assertThat("person's age still 45, not updated", personUpdated.getAge(), is(equalTo(45))); + + connection1.commit(); + + // viewed from connection2 : assert that person's age has been updated after issuing commit + people = selectAllPeople(connection2); + personUpdated = people.iterator().next(); + assertThat("person's age updated to 65", personUpdated.getAge(), is(equalTo(65))); + } + + @Test + void givenAutoCommitFalse_whenInsertAndUpdateWithCommitOnlyAtEnd_thenDataOnlyViewableAfterCommit() throws SQLException { + + connection1.setAutoCommit(false); + + Person person = new Person(1, "John", "Doe", 45); + insertPerson(connection1, person); + + // viewed from different connection, connection2 : assert that person has not yet been + // persisted to database before issuing commit + List people = selectAllPeople(connection2); + assertThat("No people have been inserted into database yet", people.size(), is(equalTo(0))); + + updatePersonAgeById(connection1, 1, 65); + + // viewed from connection2 : assert that person has still not yet been + // persisted to database before issuing commit + people = selectAllPeople(connection2); + assertThat("No people have been inserted into database yet", people.size(), is(equalTo(0))); + + connection1.commit(); + + // viewed from connection2 : assert that person record has been persisted to + // database and person's age has been updated after issuing commit + people = selectAllPeople(connection2); + Person personUpdated = people.iterator().next(); + assertThat("person's age updated to 65", personUpdated.getAge(), is(equalTo(65))); + } + + @Test + void givenAutoCommitTrue_whenUpdateWithNestedSelect_thenUpdatePersistedWithoutCommit() throws SQLException { + + connection1.setAutoCommit(true); + + Person person = new Person(1, "John", "Doe", 45); + insertPerson(connection1, person); + + updatePersonAgeByName(connection1, "John", 77); + + // viewed from connection2 : assert person's age has been updated correctly to database + // without issuing commit + List people = selectAllPeople(connection2); + Person personUpdated = people.iterator().next(); + assertThat("updated age correct", personUpdated.getAge(), is(equalTo(77))); + } + + @Test + void givenAutoCommitFalse_whenModeChangedToTrueAfterSQLUpdate_thenUpdatePersistedWithoutCommit() throws SQLException { + + connection1.setAutoCommit(false); + + Person person = new Person(1, "John", "Doe", 45); + insertPerson(connection1, person); + updatePersonAgeByName(connection1, "John", 77); + + connection1.setAutoCommit(true); + + // viewed from connection2 : assert record inserted and person's age has been updated + // correctly to database after auto-commit changed false -> true ... without explicit commit needed + List people = selectAllPeople(connection2); + Person personUpdated = people.iterator().next(); + assertThat("updated age correct", personUpdated.getAge(), is(equalTo(77))); + } + + @AfterEach + void deleteAllRecords() throws SQLException { + + if (connection1.getAutoCommit() == false) { + connection1.setAutoCommit(true); + } + + deleteAllPeople(connection1); + } + + @AfterAll + static void closeConnections() throws SQLException { + + connection1.close(); + connection2.close(); + } + + private static void createPersonTable(Connection connection) throws SQLException { + try(Statement statement = connection.createStatement()) { + statement.executeUpdate(CREATE_PERSON_TABLE_SQL); + } + } + + private static int insertPerson(Connection connection, Person person) throws SQLException { + + try (PreparedStatement preparedStatement = connection.prepareStatement(INSERT_PERSON_SQL)) { + + preparedStatement.setInt(1, person.getId()); + preparedStatement.setString(2, person.getName()); + preparedStatement.setString(3, person.getLastName()); + preparedStatement.setInt(4, person.getAge()); + + // execute statement and return the number of rows inserted + return preparedStatement.executeUpdate(); + } + } + + private static void deleteAllPeople(Connection connection) throws SQLException { + try (Statement statement = connection.createStatement()) { + statement.execute(DELETE_ALL_PEOPLE_SQL); + } + } + + private static List selectAllPeople(Connection connection) throws SQLException { + + List people = null; + + try (Statement statement = connection.createStatement()) { + + people = new ArrayList<>(); + ResultSet resultSet = statement.executeQuery(SELECT_ALL_PEOPLE_SQL); + + while (resultSet.next()) { + Person person = new Person(); + + person.setId(resultSet.getInt("id")); + person.setName(resultSet.getString("name")); + person.setLastName(resultSet.getString("lastName")); + person.setAge(resultSet.getInt("age")); + + people.add(person); + } + } + + return people; + } + + private static void updatePersonAgeById(Connection connection, int id, int newAge) throws SQLException { + + try (PreparedStatement preparedStatement = connection.prepareStatement(UPDATE_PERSON_AGE_BY_ID_SQL)) { + + preparedStatement.setInt(1, newAge); + preparedStatement.setInt(2, id); + + preparedStatement.executeUpdate(); + } + } + + private static void updatePersonAgeByName(Connection connection, String name, int newAge) throws SQLException { + try (PreparedStatement preparedStatement = connection.prepareStatement(UPDATE_PERSON_AGE_BY_NAME_SQL)) { + + preparedStatement.setInt(1, newAge); + preparedStatement.setString(2, name); + + preparedStatement.executeUpdate(); + } + } +} diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 77f3fdb625..86e496e3f8 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -58,6 +58,7 @@ spring-boot-persistence-h2 spring-boot-persistence-mongodb spring-data-cassandra + spring-data-cassandra-test spring-data-cassandra-reactive spring-data-cosmosdb spring-data-couchbase-2 @@ -87,7 +88,7 @@ spring-jpa-2 spring-jdbc spring-jooq - + spring-mybatis spring-persistence-simple diff --git a/persistence-modules/spring-data-cassandra-test/README.md b/persistence-modules/spring-data-cassandra-test/README.md new file mode 100644 index 0000000000..cfad972cb3 --- /dev/null +++ b/persistence-modules/spring-data-cassandra-test/README.md @@ -0,0 +1,16 @@ +## Spring @DataCassandraTest + +### Build the Project +``` +mvn clean install +``` + +### Prerequisite To Run Test +- Docker Engine must be running on the system +- Docker Compose must be installed + +### Run Tests Directly +``` +mvn test +``` + diff --git a/persistence-modules/spring-data-cassandra-test/pom.xml b/persistence-modules/spring-data-cassandra-test/pom.xml new file mode 100644 index 0000000000..f2cbc834de --- /dev/null +++ b/persistence-modules/spring-data-cassandra-test/pom.xml @@ -0,0 +1,77 @@ + + + 4.0.0 + spring-data-cassandra-test + spring-data-cassandra-test + jar + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 + + + + 2.5.3 + 1.18.18 + 4.13.0 + 4.3.1.0 + 1.15.3 + 1.5.0 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-data-cassandra + ${spring-boot-starter-data-cassandra.version} + + + + com.datastax.oss + java-driver-core + ${java-driver-core.version} + + + + org.projectlombok + lombok + ${lombok.version} + + + + com.datastax.oss + native-protocol + ${native-protocol.version} + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.testcontainers + testcontainers + ${testcontainers.version} + test + + + + org.testcontainers + cassandra + ${testcontainers.version} + test + + + + \ No newline at end of file diff --git a/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/CassandraDataTestApplication.java b/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/CassandraDataTestApplication.java new file mode 100644 index 0000000000..f0e6ba3c88 --- /dev/null +++ b/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/CassandraDataTestApplication.java @@ -0,0 +1,11 @@ +package com.baeldung.spring.data.cassandra.test; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class CassandraDataTestApplication { + public static void main(String[] args) { + SpringApplication.run(CassandraDataTestApplication.class, args); + } +} diff --git a/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/api/InventoryController.java b/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/api/InventoryController.java new file mode 100644 index 0000000000..6c4dfe055c --- /dev/null +++ b/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/api/InventoryController.java @@ -0,0 +1,43 @@ +package com.baeldung.spring.data.cassandra.test.api; + +import com.baeldung.spring.data.cassandra.test.domain.Vehicle; +import com.baeldung.spring.data.cassandra.test.service.InventoryService; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/v1/api/inventory") +public class InventoryController { + private InventoryService inventoryService; + + public InventoryController(InventoryService inventoryService) { + this.inventoryService = inventoryService; + } + + @GetMapping("/vehicles") + public List getVehicles() { + return this.inventoryService.getVehicles(); + } + + @PostMapping("/vehicles") + public void addVehicles(@RequestBody List vehicles) { + this.inventoryService.addVehicles(vehicles); + } + + @PutMapping("/vehicles") + public void updateVehicles(@RequestBody List vehicles) { + this.inventoryService.updateVehicles(vehicles); + } + + @PutMapping("/vehicles/{vin}") + public void updateVehicles(@PathVariable(name = "vin") String vin, + @RequestBody Vehicle vehicles) { + this.inventoryService.updateVehicle(vin, vehicles); + } + + @DeleteMapping("/vehicles/{vin}") + public void removeVehicle(@PathVariable(name = "vin") String vin) { + this.inventoryService.deleteVehicle(vin); + } +} diff --git a/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/config/CassandraConfig.java b/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/config/CassandraConfig.java new file mode 100644 index 0000000000..d362d67a68 --- /dev/null +++ b/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/config/CassandraConfig.java @@ -0,0 +1,24 @@ +package com.baeldung.spring.data.cassandra.test.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.data.cassandra.config.AbstractCassandraConfiguration; + +@Configuration +public class CassandraConfig extends AbstractCassandraConfiguration { + @Override + protected String getKeyspaceName() { + return "inventory"; + } + + @Override + public String getContactPoints() { + return "localhost"; + } + + @Override + protected String getLocalDataCenter() { + return "datacenter1"; + } + + +} diff --git a/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/domain/Vehicle.java b/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/domain/Vehicle.java new file mode 100644 index 0000000000..aa16440c83 --- /dev/null +++ b/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/domain/Vehicle.java @@ -0,0 +1,17 @@ +package com.baeldung.spring.data.cassandra.test.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; +import org.springframework.data.annotation.Id; +import org.springframework.data.cassandra.core.mapping.Table; + +@Data +@Table("vehicles") +@AllArgsConstructor +public class Vehicle { + @Id + private String vin; + private Integer year; + private String make; + private String model; +} diff --git a/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/repository/InventoryRepository.java b/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/repository/InventoryRepository.java new file mode 100644 index 0000000000..c6fe4a91fe --- /dev/null +++ b/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/repository/InventoryRepository.java @@ -0,0 +1,26 @@ +package com.baeldung.spring.data.cassandra.test.repository; + +import com.baeldung.spring.data.cassandra.test.domain.Vehicle; +import com.datastax.oss.driver.api.core.DefaultConsistencyLevel; +import org.springframework.data.cassandra.repository.Consistency; +import org.springframework.data.cassandra.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public interface InventoryRepository extends CrudRepository { + + @Query("select * from vehicles") + @Consistency(DefaultConsistencyLevel.LOCAL_QUORUM) + List findAllVehicles(); + + @Consistency(DefaultConsistencyLevel.LOCAL_QUORUM) + Optional findByVin(@Param("vin") String vin); + + @Consistency(DefaultConsistencyLevel.LOCAL_QUORUM) + void deleteByVin(String vin); +} diff --git a/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/service/InventoryService.java b/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/service/InventoryService.java new file mode 100644 index 0000000000..75a198738a --- /dev/null +++ b/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/service/InventoryService.java @@ -0,0 +1,47 @@ +package com.baeldung.spring.data.cassandra.test.service; + +import com.baeldung.spring.data.cassandra.test.domain.Vehicle; +import com.baeldung.spring.data.cassandra.test.repository.InventoryRepository; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class InventoryService { + private final InventoryRepository inventoryRepository; + + public InventoryService(InventoryRepository inventoryRepository) { + this.inventoryRepository = inventoryRepository; + } + + public List getVehicles() { + return this.inventoryRepository.findAllVehicles(); + } + + public Vehicle getVehicle(String vin) { + return this.inventoryRepository.findByVin(vin).orElse(null); + } + + public void addVehicles(List vehicles) { + this.inventoryRepository.saveAll(vehicles); + } + + public void updateVehicles(List vehicles) { + this.inventoryRepository.saveAll(vehicles); + } + + public void updateVehicle(String vin, Vehicle vehicle) { + Vehicle existingVehicle = this.inventoryRepository.findByVin(vin) + .orElseThrow(() -> new RuntimeException("Vehicle not found")); + + existingVehicle.setMake(vehicle.getMake()); + existingVehicle.setYear(vehicle.getYear()); + existingVehicle.setModel(vehicle.getModel()); + + this.inventoryRepository.save(existingVehicle); + } + + public void deleteVehicle(String vin) { + this.inventoryRepository.deleteByVin(vin); + } +} diff --git a/persistence-modules/spring-data-cassandra-test/src/main/resources/application.yml b/persistence-modules/spring-data-cassandra-test/src/main/resources/application.yml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/persistence-modules/spring-data-cassandra-test/src/main/resources/logback.xml b/persistence-modules/spring-data-cassandra-test/src/main/resources/logback.xml new file mode 100644 index 0000000000..612e9cac40 --- /dev/null +++ b/persistence-modules/spring-data-cassandra-test/src/main/resources/logback.xml @@ -0,0 +1,14 @@ + + + + + %d{dd-MM-yyyy HH:mm:ss.SSS} %magenta([%thread]) %highlight(%-5level) %logger{36}.%M - %msg%n + + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/spring-data-cassandra-test/src/test/java/com/baeldung/spring/data/cassandra/test/service/InventoryServiceLiveTest.java b/persistence-modules/spring-data-cassandra-test/src/test/java/com/baeldung/spring/data/cassandra/test/service/InventoryServiceLiveTest.java new file mode 100644 index 0000000000..80958d01d2 --- /dev/null +++ b/persistence-modules/spring-data-cassandra-test/src/test/java/com/baeldung/spring/data/cassandra/test/service/InventoryServiceLiveTest.java @@ -0,0 +1,71 @@ +package com.baeldung.spring.data.cassandra.test.service; + +import com.baeldung.spring.data.cassandra.test.config.CassandraConfig; +import com.baeldung.spring.data.cassandra.test.domain.Vehicle; +import com.baeldung.spring.data.cassandra.test.repository.InventoryRepository; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Ignore; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.data.cassandra.DataCassandraTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.junit4.SpringRunner; +import org.testcontainers.containers.DockerComposeContainer; + +import java.io.File; +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +@RunWith(SpringRunner.class) +@DataCassandraTest +@Import(CassandraConfig.class) +public class InventoryServiceLiveTest { + @Autowired + private InventoryRepository repository; + + private InventoryService inventoryService; + + @ClassRule + public static DockerComposeContainer environment = + new DockerComposeContainer(new File("src/test/resources/compose-test.yml")); + + @Before + public void setUp() { + inventoryService = new InventoryService(this.repository); + } + + @Test + public void givenVehiclesInDBInitially_whenRetrieved_thenReturnAllVehiclesFromDB() { + List vehicles = inventoryService.getVehicles(); + assertThat(vehicles).isNotNull(); + assertThat(vehicles).isNotEmpty(); + } + + @Test + public void whenAddMoreVehiclesToDB_thenRetrievalReturnsAllVehicles() { + String vin1 = "ABC123"; + String vin2 = "XYZ123"; + List vehicles = Arrays.asList( + new Vehicle(vin1, 2020, "Toyota", "Camry"), + new Vehicle(vin2, 2019, "Honda", "Prius") + ); + inventoryService.addVehicles(vehicles); + + vehicles = inventoryService.getVehicles(); + assertThat(vehicles).isNotNull(); + assertThat(vehicles).isNotEmpty(); + assertThat(vehicles.size()).isEqualTo(5); + + Vehicle vehicle = inventoryService.getVehicle(vin1); + assertThat(vehicle).isNotNull(); + assertThat(vehicle.getVin()).isEqualTo(vin1); + + vehicle = inventoryService.getVehicle(vin2); + assertThat(vehicle).isNotNull(); + assertThat(vehicle.getVin()).isEqualTo(vin2); + } +} diff --git a/persistence-modules/spring-data-cassandra-test/src/test/resources/bootstrap-test.cql b/persistence-modules/spring-data-cassandra-test/src/test/resources/bootstrap-test.cql new file mode 100644 index 0000000000..6f3821ed83 --- /dev/null +++ b/persistence-modules/spring-data-cassandra-test/src/test/resources/bootstrap-test.cql @@ -0,0 +1,20 @@ +CREATE KEYSPACE inventory +WITH replication = { + 'class' : 'NetworkTopologyStrategy', + 'datacenter1' : 3 +}; + +use inventory; + +CREATE TABLE vehicles ( + vin text PRIMARY KEY, + year int, + make varchar, + model varchar +); + +consistency LOCAL_QUORUM; + +insert into vehicles (vin, year, make, model) values ('387KSJHFK23874GH', 2020, 'Ford', 'F-150'); +insert into vehicles (vin, year, make, model) values ('534HNDHFK23873EF', 2020, 'Honda', 'Accord'); +insert into vehicles (vin, year, make, model) values ('953TOYJEK23853DB', 2020, 'Toyota', 'Camry'); \ No newline at end of file diff --git a/persistence-modules/spring-data-cassandra-test/src/test/resources/compose-test.yml b/persistence-modules/spring-data-cassandra-test/src/test/resources/compose-test.yml new file mode 100644 index 0000000000..50f0f448f6 --- /dev/null +++ b/persistence-modules/spring-data-cassandra-test/src/test/resources/compose-test.yml @@ -0,0 +1,79 @@ +version: '2.1' +services: + cassandra1: + image: cassandra:3.11.10 + hostname: cassandra1 + networks: + - cassandranet + ports: + - "9042:9042" + environment: + CASSANDRA_SEEDS: "cassandra1" + CASSANDRA_DC: datacenter1 + CASSANDRA_RACK: rack1 + CASSANDRA_ENDPOINT_SNITCH: GossipingPropertyFileSnitch + healthcheck: + test: [ "CMD", "cqlsh", "-u cassandra", "-p cassandra" ,"-e describe keyspaces" ] + interval: 15s + timeout: 10s + retries: 10 + + cassandra2: + image: cassandra:3.11.10 + hostname: cassandra2 + networks: + - cassandranet + depends_on: + cassandra1: + condition: service_healthy + ports: + - "9043:9042" + environment: + CASSANDRA_SEEDS: "cassandra1" + CASSANDRA_DC: datacenter1 + CASSANDRA_RACK: rack1 + CASSANDRA_ENDPOINT_SNITCH: GossipingPropertyFileSnitch + healthcheck: + test: [ "CMD", "cqlsh", "-u cassandra", "-p cassandra" ,"-e describe keyspaces" ] + interval: 15s + timeout: 10s + retries: 10 + + cassandra3: + image: cassandra:3.11.10 + hostname: cassandra3 + networks: + - cassandranet + depends_on: + cassandra2: + condition: service_healthy + ports: + - "9044:9042" + environment: + CASSANDRA_SEEDS: "cassandra1" + CASSANDRA_DC: datacenter1 + CASSANDRA_RACK: rack1 + CASSANDRA_ENDPOINT_SNITCH: GossipingPropertyFileSnitch + healthcheck: + test: [ "CMD", "cqlsh", "-u cassandra", "-p cassandra" ,"-e describe keyspaces" ] + interval: 15s + timeout: 10s + retries: 10 + + cassandra-load-keyspace: + image: cassandra:3.11.10 + networks: + - cassandranet + depends_on: + cassandra1: + condition: service_healthy + cassandra2: + condition: service_healthy + cassandra3: + condition: service_healthy + volumes: + - ./bootstrap-test.cql:/schema.cql + command: /bin/bash -c "echo loading cassandra keyspace && cqlsh cassandra1 -f /schema.cql" + +networks: + cassandranet: \ No newline at end of file diff --git a/persistence-modules/spring-mybatis/pom.xml b/persistence-modules/spring-mybatis/pom.xml index 9247d59fe4..1a55e76900 100644 --- a/persistence-modules/spring-mybatis/pom.xml +++ b/persistence-modules/spring-mybatis/pom.xml @@ -84,7 +84,7 @@ - 5.1.8.RELEASE + 5.3.8 2.0.2 3.5.2 diff --git a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperBootIntegrationTest.java b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperBootUnitTest.java similarity index 82% rename from persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperBootIntegrationTest.java rename to persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperBootUnitTest.java index 531356ffa2..d9f757aa30 100644 --- a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperBootIntegrationTest.java +++ b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperBootUnitTest.java @@ -8,6 +8,6 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest @ContextConfiguration(classes = PersistenceAutoConfig.class) -public class ArticleMapperBootIntegrationTest extends ArticleMapperCommonTest { +public class ArticleMapperBootUnitTest extends ArticleMapperCommonUnitTest { } diff --git a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperCommonTest.java b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperCommonUnitTest.java similarity index 94% rename from persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperCommonTest.java rename to persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperCommonUnitTest.java index 33071dc0c1..2a93ca3d61 100644 --- a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperCommonTest.java +++ b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperCommonUnitTest.java @@ -5,7 +5,7 @@ import org.springframework.beans.factory.annotation.Autowired; import static org.assertj.core.api.Assertions.assertThat; -class ArticleMapperCommonTest { +class ArticleMapperCommonUnitTest { @Autowired ArticleMapper articleMapper; diff --git a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperIntegrationTest.java b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperUnitTest.java similarity index 80% rename from persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperIntegrationTest.java rename to persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperUnitTest.java index 9298714cb2..9c677ecee5 100644 --- a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperIntegrationTest.java +++ b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperUnitTest.java @@ -6,6 +6,6 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = PersistenceConfig.class) -public class ArticleMapperIntegrationTest extends ArticleMapperCommonTest { +public class ArticleMapperUnitTest extends ArticleMapperCommonUnitTest { } diff --git a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperXMLIntegrationTest.java b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperXMLUnitTest.java similarity index 79% rename from persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperXMLIntegrationTest.java rename to persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperXMLUnitTest.java index de8974d4ad..96c7c162c5 100644 --- a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperXMLIntegrationTest.java +++ b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperXMLUnitTest.java @@ -6,6 +6,6 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:/beans.xml") -public class ArticleMapperXMLIntegrationTest extends ArticleMapperCommonTest { +public class ArticleMapperXMLUnitTest extends ArticleMapperCommonUnitTest { }