diff --git a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Graph.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/astar/Graph.java similarity index 100% rename from algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Graph.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/astar/Graph.java diff --git a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/GraphNode.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/astar/GraphNode.java similarity index 100% rename from algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/GraphNode.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/astar/GraphNode.java diff --git a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteFinder.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/astar/RouteFinder.java similarity index 100% rename from algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteFinder.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/astar/RouteFinder.java diff --git a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteNode.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/astar/RouteNode.java similarity index 100% rename from algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteNode.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/astar/RouteNode.java diff --git a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Scorer.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/astar/Scorer.java similarity index 100% rename from algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Scorer.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/astar/Scorer.java diff --git a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/HaversineScorer.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/astar/underground/HaversineScorer.java similarity index 100% rename from algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/HaversineScorer.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/astar/underground/HaversineScorer.java diff --git a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/Station.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/astar/underground/Station.java similarity index 100% rename from algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/Station.java rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/astar/underground/Station.java diff --git a/core-java-modules/core-java-11-2/README.md b/core-java-modules/core-java-11-2/README.md index b864e1ca99..62acd33188 100644 --- a/core-java-modules/core-java-11-2/README.md +++ b/core-java-modules/core-java-11-2/README.md @@ -12,5 +12,4 @@ This module contains articles about Java 11 core features - [Java HTTPS Client Certificate Authentication](https://www.baeldung.com/java-https-client-certificate-authentication) - [Call Methods at Runtime Using Java Reflection](https://www.baeldung.com/java-method-reflection) - [Java HttpClient Basic Authentication](https://www.baeldung.com/java-httpclient-basic-auth) -- [Java HttpClient With SSL](https://www.baeldung.com/java-httpclient-ssl) -- [Adding Parameters to Java HttpClient Requests](https://www.baeldung.com/java-httpclient-request-parameters) +- [Java HttpClient With SSL](https://www.baeldung.com/java-httpclient-ssl) \ No newline at end of file diff --git a/core-java-modules/core-java-11-3/README.md b/core-java-modules/core-java-11-3/README.md new file mode 100644 index 0000000000..f46ab02bca --- /dev/null +++ b/core-java-modules/core-java-11-3/README.md @@ -0,0 +1,6 @@ +## Core Java 11 + +This module contains articles about Java 11 core features + +### Relevant articles +- [Adding Parameters to Java HttpClient Requests](https://www.baeldung.com/java-httpclient-request-parameters) diff --git a/core-java-modules/core-java-11-3/pom.xml b/core-java-modules/core-java-11-3/pom.xml new file mode 100644 index 0000000000..b4a4591b28 --- /dev/null +++ b/core-java-modules/core-java-11-3/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + core-java-11-3 + 0.1.0-SNAPSHOT + core-java-11-3 + jar + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + ../../pom.xml + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${maven.compiler.source.version} + ${maven.compiler.target.version} + + + + + + + 11 + 11 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-11-2/src/test/java/com/baeldung/httpclient/parameters/HttpClientParametersLiveTest.java b/core-java-modules/core-java-11-3/src/test/java/com/baeldung/httpclient/parameters/HttpClientParametersLiveTest.java similarity index 100% rename from core-java-modules/core-java-11-2/src/test/java/com/baeldung/httpclient/parameters/HttpClientParametersLiveTest.java rename to core-java-modules/core-java-11-3/src/test/java/com/baeldung/httpclient/parameters/HttpClientParametersLiveTest.java diff --git a/core-java-modules/core-java-collections-maps-5/src/main/java/com/baeldung/map/multikey/BaseClassUserCache.java b/core-java-modules/core-java-collections-maps-5/src/main/java/com/baeldung/map/multikey/BaseClassUserCache.java new file mode 100644 index 0000000000..1449727efc --- /dev/null +++ b/core-java-modules/core-java-collections-maps-5/src/main/java/com/baeldung/map/multikey/BaseClassUserCache.java @@ -0,0 +1,24 @@ +package com.baeldung.map.multikey; + +import java.util.HashMap; +import java.util.Map; + +public class BaseClassUserCache { + private final Map cache = new HashMap<>(); + + public User getById(String id) { + return cache.get(id); + } + + public User getById(Long id) { + return cache.get(id); + } + + public void storeById(String id, User user) { + cache.put(id, user); + } + + public void storeById(Long id, User user) { + cache.put(id, user); + } +} diff --git a/core-java-modules/core-java-collections-maps-5/src/main/java/com/baeldung/map/multikey/MultipleMapsUserCache.java b/core-java-modules/core-java-collections-maps-5/src/main/java/com/baeldung/map/multikey/MultipleMapsUserCache.java new file mode 100644 index 0000000000..6b7e56f209 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-5/src/main/java/com/baeldung/map/multikey/MultipleMapsUserCache.java @@ -0,0 +1,25 @@ +package com.baeldung.map.multikey; + +import java.util.HashMap; +import java.util.Map; + +public class MultipleMapsUserCache { + private final Map stringCache = new HashMap<>(); + private final Map longCache = new HashMap<>(); + + public User getById(String id) { + return stringCache.get(id); + } + + public User getById(Long id) { + return longCache.get(id); + } + + public void storeById(String id, User user) { + stringCache.put(id, user); + } + + public void storeById(Long id, User user) { + longCache.put(id, user); + } +} diff --git a/core-java-modules/core-java-collections-maps-5/src/main/java/com/baeldung/map/multikey/User.java b/core-java-modules/core-java-collections-maps-5/src/main/java/com/baeldung/map/multikey/User.java new file mode 100644 index 0000000000..392587d305 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-5/src/main/java/com/baeldung/map/multikey/User.java @@ -0,0 +1,13 @@ +package com.baeldung.map.multikey; + +public class User { + private final String name; + + public User(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/core-java-modules/core-java-collections-maps-5/src/main/java/com/baeldung/map/multikey/WrapperClassUserCache.java b/core-java-modules/core-java-collections-maps-5/src/main/java/com/baeldung/map/multikey/WrapperClassUserCache.java new file mode 100644 index 0000000000..3ce920ead1 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-5/src/main/java/com/baeldung/map/multikey/WrapperClassUserCache.java @@ -0,0 +1,42 @@ +package com.baeldung.map.multikey; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +public class WrapperClassUserCache { + private Map cache = new HashMap<>(); + + public User getById(CacheKey key) { + return cache.get(key); + } + + public void storeById(CacheKey key, User user) { + cache.put(key, user); + } + + public static class CacheKey { + private final Object value; + + public CacheKey(String value) { + this.value = value; + } + + public CacheKey(Long value) { + this.value = value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + CacheKey cacheKey = (CacheKey) o; + return value.equals(cacheKey.value); + } + + @Override + public int hashCode() { + return Objects.hash(value); + } + } +} diff --git a/core-java-modules/core-java-collections-maps-5/src/main/java/com/baeldung/map/multikey/WrapperInterfaceUserCache.java b/core-java-modules/core-java-collections-maps-5/src/main/java/com/baeldung/map/multikey/WrapperInterfaceUserCache.java new file mode 100644 index 0000000000..586a1bdee7 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-5/src/main/java/com/baeldung/map/multikey/WrapperInterfaceUserCache.java @@ -0,0 +1,62 @@ +package com.baeldung.map.multikey; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +public class WrapperInterfaceUserCache { + private Map cache = new HashMap<>(); + + public User getById(CacheKey key) { + return cache.get(key); + } + + public void storeById(CacheKey key, User user) { + cache.put(key, user); + } + + public interface CacheKey { + } + + public static class StringCacheKey implements CacheKey{ + private final String value; + + public StringCacheKey(String value) { + this.value = value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + StringCacheKey that = (StringCacheKey) o; + return value.equals(that.value); + } + + @Override + public int hashCode() { + return Objects.hash(value); + } + } + + public static class LongCacheKey implements CacheKey { + private final Long value; + + public LongCacheKey(Long value) { + this.value = value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + LongCacheKey that = (LongCacheKey) o; + return value.equals(that.value); + } + + @Override + public int hashCode() { + return Objects.hash(value); + } + } +} diff --git a/core-java-modules/core-java-collections-maps-5/src/test/java/com/baeldung/map/multikey/BaseClassUserCacheUnitTest.java b/core-java-modules/core-java-collections-maps-5/src/test/java/com/baeldung/map/multikey/BaseClassUserCacheUnitTest.java new file mode 100644 index 0000000000..6a35e4c10a --- /dev/null +++ b/core-java-modules/core-java-collections-maps-5/src/test/java/com/baeldung/map/multikey/BaseClassUserCacheUnitTest.java @@ -0,0 +1,32 @@ +package com.baeldung.map.multikey; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class BaseClassUserCacheUnitTest { + private BaseClassUserCache cache = new BaseClassUserCache(); + + @BeforeEach + public void setup() { + cache.storeById("a", new User("User A")); + cache.storeById("b", new User("User B")); + cache.storeById(3L, new User("User 3")); + cache.storeById(4L, new User("User 4")); + } + + @Test + public void getByString() { + User user = cache.getById("b"); + assertNotNull(user); + assertEquals("User B", user.getName()); + } + + @Test + public void getByLong() { + User user = cache.getById(4L); + assertNotNull(user); + assertEquals("User 4", user.getName()); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-collections-maps-5/src/test/java/com/baeldung/map/multikey/MultipleMapsUserCacheUnitTest.java b/core-java-modules/core-java-collections-maps-5/src/test/java/com/baeldung/map/multikey/MultipleMapsUserCacheUnitTest.java new file mode 100644 index 0000000000..0b8473c0df --- /dev/null +++ b/core-java-modules/core-java-collections-maps-5/src/test/java/com/baeldung/map/multikey/MultipleMapsUserCacheUnitTest.java @@ -0,0 +1,33 @@ +package com.baeldung.map.multikey; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class MultipleMapsUserCacheUnitTest { + private MultipleMapsUserCache cache = new MultipleMapsUserCache(); + + @BeforeEach + public void setup() { + cache.storeById("a", new User("User A")); + cache.storeById("b", new User("User B")); + cache.storeById(3L, new User("User 3")); + cache.storeById(4L, new User("User 4")); + } + + @Test + public void getByString() { + User user = cache.getById("b"); + assertNotNull(user); + assertEquals("User B", user.getName()); + } + + @Test + public void getByLong() { + User user = cache.getById(4L); + assertNotNull(user); + assertEquals("User 4", user.getName()); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-collections-maps-5/src/test/java/com/baeldung/map/multikey/WrapperClassUserCacheUnitTest.java b/core-java-modules/core-java-collections-maps-5/src/test/java/com/baeldung/map/multikey/WrapperClassUserCacheUnitTest.java new file mode 100644 index 0000000000..caff7ef050 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-5/src/test/java/com/baeldung/map/multikey/WrapperClassUserCacheUnitTest.java @@ -0,0 +1,33 @@ +package com.baeldung.map.multikey; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class WrapperClassUserCacheUnitTest { + private WrapperClassUserCache cache = new WrapperClassUserCache(); + + @BeforeEach + public void setup() { + cache.storeById(new WrapperClassUserCache.CacheKey("a"), new User("User A")); + cache.storeById(new WrapperClassUserCache.CacheKey("b"), new User("User B")); + cache.storeById(new WrapperClassUserCache.CacheKey(3L), new User("User 3")); + cache.storeById(new WrapperClassUserCache.CacheKey(4L), new User("User 4")); + } + + @Test + public void getByString() { + User user = cache.getById(new WrapperClassUserCache.CacheKey("b")); + assertNotNull(user); + assertEquals("User B", user.getName()); + } + + @Test + public void getByLong() { + User user = cache.getById(new WrapperClassUserCache.CacheKey(4L)); + assertNotNull(user); + assertEquals("User 4", user.getName()); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-collections-maps-5/src/test/java/com/baeldung/map/multikey/WrapperInterfaceUserCacheUnitTest.java b/core-java-modules/core-java-collections-maps-5/src/test/java/com/baeldung/map/multikey/WrapperInterfaceUserCacheUnitTest.java new file mode 100644 index 0000000000..211e6aa182 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-5/src/test/java/com/baeldung/map/multikey/WrapperInterfaceUserCacheUnitTest.java @@ -0,0 +1,33 @@ +package com.baeldung.map.multikey; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class WrapperInterfaceUserCacheUnitTest { + private WrapperInterfaceUserCache cache = new WrapperInterfaceUserCache(); + + @BeforeEach + public void setup() { + cache.storeById(new WrapperInterfaceUserCache.StringCacheKey("a"), new User("User A")); + cache.storeById(new WrapperInterfaceUserCache.StringCacheKey("b"), new User("User B")); + cache.storeById(new WrapperInterfaceUserCache.LongCacheKey(3L), new User("User 3")); + cache.storeById(new WrapperInterfaceUserCache.LongCacheKey(4L), new User("User 4")); + } + + @Test + public void getByString() { + User user = cache.getById(new WrapperInterfaceUserCache.StringCacheKey("b")); + assertNotNull(user); + assertEquals("User B", user.getName()); + } + + @Test + public void getByLong() { + User user = cache.getById(new WrapperInterfaceUserCache.LongCacheKey(4L)); + assertNotNull(user); + assertEquals("User 4", user.getName()); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-streams-4/pom.xml b/core-java-modules/core-java-streams-4/pom.xml index beed277f78..65de1d666c 100644 --- a/core-java-modules/core-java-streams-4/pom.xml +++ b/core-java-modules/core-java-streams-4/pom.xml @@ -43,6 +43,16 @@ 3.23.1 test + + org.openjdk.jmh + jmh-core + ${jmh-core.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh-generator.version} + diff --git a/core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/filteronlyoneelement/BenchmarkRunner.java b/core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/filteronlyoneelement/BenchmarkRunner.java new file mode 100644 index 0000000000..327bdc4df3 --- /dev/null +++ b/core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/filteronlyoneelement/BenchmarkRunner.java @@ -0,0 +1,56 @@ +package com.baeldung.streams.filteronlyoneelement; + +import java.util.function.Predicate; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.infra.Blackhole; + +public class BenchmarkRunner { + + public static void main(String[] args) throws Exception { + org.openjdk.jmh.Main.main(args); + } + + @State(Scope.Benchmark) + public static class MyState { + final Stream getIntegers() { + return IntStream.range(1, 1000000) + .boxed(); + } + + final Predicate PREDICATE = i -> i == 751879; + } + + @Benchmark + public void evaluateFindUniqueElementMatchingPredicate_WithReduction(Blackhole blackhole, MyState state) { + blackhole.consume(FilterUtils.findUniqueElementMatchingPredicate_WithReduction(state.getIntegers(), state.PREDICATE)); + } + + @Benchmark + public void evaluateFindUniqueElementMatchingPredicate_WithCollectingAndThen(Blackhole blackhole, MyState state) { + blackhole.consume(FilterUtils.findUniqueElementMatchingPredicate_WithCollectingAndThen(state.getIntegers(), state.PREDICATE)); + } + + @Benchmark + public void evaluateGetUniqueElementMatchingPredicate_WithReduction(Blackhole blackhole, MyState state) { + try { + FilterUtils.getUniqueElementMatchingPredicate_WithReduction(state.getIntegers(), state.PREDICATE); + } catch (IllegalStateException exception) { + blackhole.consume(exception); + } + } + + @Benchmark + public void evaluateGetUniqueElementMatchingPredicate_WithCollectingAndThen(Blackhole blackhole, MyState state) { + try { + FilterUtils.getUniqueElementMatchingPredicate_WithCollectingAndThen(state.getIntegers(), state.PREDICATE); + } catch (IllegalStateException exception) { + blackhole.consume(exception); + } + } + +} diff --git a/core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/filteronlyoneelement/FilterUtils.java b/core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/filteronlyoneelement/FilterUtils.java new file mode 100644 index 0000000000..65905a7bc4 --- /dev/null +++ b/core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/filteronlyoneelement/FilterUtils.java @@ -0,0 +1,50 @@ +package com.baeldung.streams.filteronlyoneelement; + +import java.util.List; +import java.util.Optional; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class FilterUtils { + + public static Optional findUniqueElementMatchingPredicate_WithReduction(Stream elements, Predicate predicate) { + return elements.filter(predicate) + .collect(Collectors.reducing((a, b) -> null)); + } + + public static T getUniqueElementMatchingPredicate_WithReduction(Stream elements, Predicate predicate) { + return elements.filter(predicate) + .reduce((a, b) -> { + throw new IllegalStateException("Too many elements match the predicate"); + }) + .orElseThrow(() -> new IllegalStateException("No element matches the predicate")); + } + + public static Optional findUniqueElementMatchingPredicate_WithCollectingAndThen(Stream elements, Predicate predicate) { + return elements.filter(predicate) + .collect(Collectors.collectingAndThen(Collectors.toList(), list -> Optional.ofNullable(findUniqueElement(list)))); + } + + private static T findUniqueElement(List elements) { + if (elements.size() == 1) { + return elements.get(0); + } + return null; + } + + public static T getUniqueElementMatchingPredicate_WithCollectingAndThen(Stream elements, Predicate predicate) { + return elements.filter(predicate) + .collect(Collectors.collectingAndThen(Collectors.toList(), FilterUtils::getUniqueElement)); + } + + private static T getUniqueElement(List elements) { + if (elements.size() > 1) { + throw new IllegalStateException("Too many elements match the predicate"); + } else if (elements.size() == 0) { + throw new IllegalStateException("No element matches the predicate"); + } + return elements.get(0); + } + +} diff --git a/core-java-modules/core-java-streams-4/src/test/java/com/baeldung/streams/filteronlyoneelement/FilterUtilsUnitTest.java b/core-java-modules/core-java-streams-4/src/test/java/com/baeldung/streams/filteronlyoneelement/FilterUtilsUnitTest.java new file mode 100644 index 0000000000..531dcc5abb --- /dev/null +++ b/core-java-modules/core-java-streams-4/src/test/java/com/baeldung/streams/filteronlyoneelement/FilterUtilsUnitTest.java @@ -0,0 +1,88 @@ +package com.baeldung.streams.filteronlyoneelement; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.function.Predicate; +import java.util.stream.Stream; + +import org.junit.jupiter.api.Test; + +public class FilterUtilsUnitTest { + + private static final Predicate IS_STRICTLY_GREATER_THAN5 = i -> i > 5; + private static final Predicate IS_STRICTLY_GREATER_THAN4 = i -> i > 4; + private static final Predicate IS_STRICTLY_GREATER_THAN3 = i -> i > 3; + + private Stream getIntegers() { + return Stream.of(1, 2, 3, 4, 5); + } + + @Test + void givenNoElementMatchingPredicate_WhenFindUniqueElementMatchingPredicateWithReduction_ThenNoneFound() { + assertTrue(FilterUtils.findUniqueElementMatchingPredicate_WithReduction(getIntegers(), IS_STRICTLY_GREATER_THAN5) + .isEmpty()); + } + + @Test + void givenTwoElementsMatchingPredicate_WhenFindUniqueElementMatchingPredicateWithReduction_ThenEmpty() { + assertTrue(FilterUtils.findUniqueElementMatchingPredicate_WithReduction(getIntegers(), IS_STRICTLY_GREATER_THAN3) + .isEmpty()); + } + + @Test + void givenOnlyOneElementMatchingPredicate_WhenFindUniqueElementMatchingPredicateWithReduction_ThenFindsIt() { + assertEquals(5, FilterUtils.findUniqueElementMatchingPredicate_WithReduction(getIntegers(), IS_STRICTLY_GREATER_THAN4) + .get()); + } + + @Test + void givenNoElementMatchingPredicate_WhenGetUniqueElementMatchingPredicateWithReduction_ThenThrows() { + assertThrows(IllegalStateException.class, () -> FilterUtils.getUniqueElementMatchingPredicate_WithReduction(getIntegers(), IS_STRICTLY_GREATER_THAN5)); + } + + @Test + void givenTwoElementsMatchingPredicate_WhenGetUniqueElementMatchingPredicateWithReduction_ThenThrows() { + assertThrows(IllegalStateException.class, () -> FilterUtils.getUniqueElementMatchingPredicate_WithReduction(getIntegers(), IS_STRICTLY_GREATER_THAN3)); + } + + @Test + void givenOnlyOneElementMatchingPredicate_WhenFindUniqueElementMatchingPredicateWithReduction_ThenGetIt() { + assertEquals(5, FilterUtils.getUniqueElementMatchingPredicate_WithReduction(getIntegers(), IS_STRICTLY_GREATER_THAN4)); + } + + @Test + void givenNoElementMatchingPredicate_WhenFindUniqueElementMatchingPredicateWithCollectingAndThen_ThenEmpty() { + assertTrue(FilterUtils.findUniqueElementMatchingPredicate_WithCollectingAndThen(getIntegers(), IS_STRICTLY_GREATER_THAN5) + .isEmpty()); + } + + @Test + void givenTwoElementsMatchingPredicate_WhenFindUniqueElementMatchingPredicateWithCollectingAndThen_ThenEmpty() { + assertTrue(FilterUtils.findUniqueElementMatchingPredicate_WithCollectingAndThen(getIntegers(), IS_STRICTLY_GREATER_THAN3) + .isEmpty()); + } + + @Test + void givenOnlyOneElementMatchingPredicate_WhenFindUniqueElementMatchingPredicateWithCollectingAndThen_ThenFindsIt() { + assertEquals(5, FilterUtils.findUniqueElementMatchingPredicate_WithCollectingAndThen(getIntegers(), IS_STRICTLY_GREATER_THAN4) + .get()); + } + + @Test + void givenNoElementMatchingPredicate_WhenGetUniqueElementMatchingPredicateWithCollectingAndThen_ThenThrows() { + assertThrows(IllegalStateException.class, () -> FilterUtils.getUniqueElementMatchingPredicate_WithCollectingAndThen(getIntegers(), IS_STRICTLY_GREATER_THAN5)); + } + + @Test + void givenTwoElementsMatchingPredicate_WhenGetUniqueElementMatchingPredicateWithCollectingAndThen_ThenThrows() { + assertThrows(IllegalStateException.class, () -> FilterUtils.getUniqueElementMatchingPredicate_WithCollectingAndThen(getIntegers(), IS_STRICTLY_GREATER_THAN3)); + } + + @Test + void givenOnlyOneElementMatchingPredicate_WhenFindUniqueElementMatchingPredicateWithCollectingAndThen_ThenGetIt() { + assertEquals(5, FilterUtils.getUniqueElementMatchingPredicate_WithCollectingAndThen(getIntegers(), IS_STRICTLY_GREATER_THAN4)); + } + +} diff --git a/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/removewhitespace/RemoveWhitespaceUnitTest.java b/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/removewhitespace/RemoveWhitespaceUnitTest.java new file mode 100644 index 0000000000..f749484ba9 --- /dev/null +++ b/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/removewhitespace/RemoveWhitespaceUnitTest.java @@ -0,0 +1,35 @@ +package com.baeldung.removewhitespace; + +import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class RemoveWhitespaceUnitTest { + private final String myString = " I am a wonderful String ! "; + + @Test + void givenStringWithWhitespace_whenRemoveAllWhitespace_shouldGetExpectedResult() { + String result = myString.replaceAll("\\s", ""); + assertThat(result).isEqualTo("IamawonderfulString!"); + } + + @Test + void givenStringWithWhitespace_whenRemoveAllWhitespaceUsingStringUtils_shouldGetExpectedResult() { + String result = StringUtils.deleteWhitespace(myString); + assertThat(result).isEqualTo("IamawonderfulString!"); + } + + @Test + void givenStringWithWhitespace_whenReplaceConsecutiveSpacesWithSingleSpace_shouldGetExpectedResult() { + String result = myString.replaceAll("\\s+", " "); + assertThat(result).isEqualTo(" I am a wonderful String ! "); + assertThat(result.trim()).isEqualTo("I am a wonderful String !"); + } + + @Test + void givenStringWithWhitespace_whenNormalizeWithApacheCommons_shouldGetExpectedResult() { + String result = StringUtils.normalizeSpace(myString); + assertThat(result).isEqualTo("I am a wonderful String !"); + } +} diff --git a/libraries-security/src/test/resources/logback-test.xml b/libraries-security/src/test/resources/logback-test.xml index 8d4771e308..fcbdb8b5f7 100644 --- a/libraries-security/src/test/resources/logback-test.xml +++ b/libraries-security/src/test/resources/logback-test.xml @@ -6,6 +6,10 @@ + + + + diff --git a/lightrun/api-service/pom.xml b/lightrun/api-service/pom.xml index ed9fc2152b..0541f6c5cb 100644 --- a/lightrun/api-service/pom.xml +++ b/lightrun/api-service/pom.xml @@ -10,10 +10,9 @@ Aggregator Service for LightRun Article - org.springframework.boot - spring-boot-starter-parent - 2.6.7 - + com.baelduung + lightrun + 0.0.1-SNAPSHOT @@ -43,6 +42,7 @@ 17 + 3.17.0 \ No newline at end of file diff --git a/lightrun/pom.xml b/lightrun/pom.xml index 4902688748..1fc8e5ea70 100644 --- a/lightrun/pom.xml +++ b/lightrun/pom.xml @@ -9,6 +9,13 @@ lightrun Services for LightRun Article pom + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../parent-boot-2 + tasks-service diff --git a/lightrun/tasks-service/pom.xml b/lightrun/tasks-service/pom.xml index 5d4bf8b6d5..19b5f0d98e 100644 --- a/lightrun/tasks-service/pom.xml +++ b/lightrun/tasks-service/pom.xml @@ -10,10 +10,9 @@ Tasks Service for LightRun Article - org.springframework.boot - spring-boot-starter-parent - 2.6.7 - + com.baelduung + lightrun + 0.0.1-SNAPSHOT @@ -64,6 +63,7 @@ 17 + 3.17.0 \ No newline at end of file diff --git a/lightrun/users-service/pom.xml b/lightrun/users-service/pom.xml index 0be696bbf0..2db0d37037 100644 --- a/lightrun/users-service/pom.xml +++ b/lightrun/users-service/pom.xml @@ -10,10 +10,9 @@ Users Service for LightRun Article - org.springframework.boot - spring-boot-starter-parent - 2.6.7 - + com.baelduung + lightrun + 0.0.1-SNAPSHOT @@ -60,6 +59,7 @@ 17 + 3.17.0 \ No newline at end of file diff --git a/mapstruct/src/main/java/com/baeldung/mapper/EmployeeMapper.java b/mapstruct/src/main/java/com/baeldung/mapper/EmployeeMapper.java index 8e00103d0e..716b05c7d9 100644 --- a/mapstruct/src/main/java/com/baeldung/mapper/EmployeeMapper.java +++ b/mapstruct/src/main/java/com/baeldung/mapper/EmployeeMapper.java @@ -6,17 +6,20 @@ import com.baeldung.entity.Division; import com.baeldung.entity.Employee; import org.mapstruct.Mapper; import org.mapstruct.Mapping; -import org.mapstruct.Mappings; import java.util.List; @Mapper public interface EmployeeMapper { - @Mappings({ @Mapping(target = "employeeId", source = "entity.id"), @Mapping(target = "employeeName", source = "entity.name"), @Mapping(target = "employeeStartDt", source = "entity.startDt", dateFormat = "dd-MM-yyyy HH:mm:ss") }) + @Mapping(target = "employeeId", source = "entity.id") + @Mapping(target = "employeeName", source = "entity.name") + @Mapping(target = "employeeStartDt", source = "entity.startDt", dateFormat = "dd-MM-yyyy HH:mm:ss") EmployeeDTO employeeToEmployeeDTO(Employee entity); - @Mappings({ @Mapping(target = "id", source = "dto.employeeId"), @Mapping(target = "name", source = "dto.employeeName"), @Mapping(target = "startDt", source = "dto.employeeStartDt", dateFormat = "dd-MM-yyyy HH:mm:ss") }) + @Mapping(target = "id", source = "dto.employeeId") + @Mapping(target = "name", source = "dto.employeeName") + @Mapping(target = "startDt", source = "dto.employeeStartDt", dateFormat = "dd-MM-yyyy HH:mm:ss") Employee employeeDTOtoEmployee(EmployeeDTO dto); DivisionDTO divisionToDivisionDTO(Division entity); diff --git a/maven-modules/maven-repositories/maven-download-artifacts/pom.xml b/maven-modules/maven-repositories/maven-download-artifacts/pom.xml new file mode 100644 index 0000000000..678fc32bec --- /dev/null +++ b/maven-modules/maven-repositories/maven-download-artifacts/pom.xml @@ -0,0 +1,52 @@ + + + 4.0.0 + maven-repository-download + Maven Release Repository + 1.0.0-SNAPSHOT + + + com.baeldung + maven-repositories + 1.0.0-SNAPSHOT + + + + + nexus-snapshot + nexus-snapshot + http://localhost:8081/repository/maven-snapshots/ + + true + + + false + + + + nexus-release + nexus-release + http://localhost:8081/repository/maven-releases/ + + false + + + + + + + com.baeldung + maven-release-repository + 1.0.0 + + + + com.baeldung + maven-snapshot-repository + 1.0.0-SNAPSHOT + + + + \ No newline at end of file diff --git a/maven-modules/maven-repositories/maven-release-repository/pom.xml b/maven-modules/maven-repositories/maven-release-repository/pom.xml new file mode 100644 index 0000000000..bd7adcbcce --- /dev/null +++ b/maven-modules/maven-repositories/maven-release-repository/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + maven-release-repository + Maven Release Repository + 1.0.0 + + + com.baeldung + maven-repositories + 1.0.0-SNAPSHOT + + + + + nexus + nexus-release + http://localhost:8081/repository/maven-releases/ + + false + + + true + + + + + + + nexus + nexus-release + http://localhost:8081/repository/maven-releases/ + + + + \ No newline at end of file diff --git a/maven-modules/maven-repositories/maven-snapshot-repository/pom.xml b/maven-modules/maven-repositories/maven-snapshot-repository/pom.xml new file mode 100644 index 0000000000..5409e47b8e --- /dev/null +++ b/maven-modules/maven-repositories/maven-snapshot-repository/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + maven-snapshot-repository + Maven Snapshot Repository + 1.0.0-SNAPSHOT + + + com.baeldung + maven-repositories + 1.0.0-SNAPSHOT + + + + + nexus + nexus-snapshot + http://localhost:8081/repository/maven-snapshots/ + + true + + + false + + + + + + + nexus + nexus-snapshot + http://localhost:8081/repository/maven-snapshots/ + + + + \ No newline at end of file diff --git a/maven-modules/maven-repositories/pom.xml b/maven-modules/maven-repositories/pom.xml new file mode 100644 index 0000000000..ba39d00d65 --- /dev/null +++ b/maven-modules/maven-repositories/pom.xml @@ -0,0 +1,23 @@ + + + 4.0.0 + maven-repositories + 1.0.0-SNAPSHOT + Maven Repositories + pom + + + com.baeldung + maven-modules + 0.0.1-SNAPSHOT + + + + maven-release-repository + maven-snapshot-repository + maven-download-artifacts + + + \ No newline at end of file diff --git a/maven-modules/pom.xml b/maven-modules/pom.xml index 253f5d9fa0..412e26f041 100644 --- a/maven-modules/pom.xml +++ b/maven-modules/pom.xml @@ -41,6 +41,7 @@ maven-parent-pom-resolution maven-simple maven-classifier + maven-repositories diff --git a/metrics/src/test/java/com/baeldung/metrics/micrometer/MicrometerAtlasIntegrationTest.java b/metrics/src/test/java/com/baeldung/metrics/micrometer/MicrometerAtlasManualTest.java similarity index 99% rename from metrics/src/test/java/com/baeldung/metrics/micrometer/MicrometerAtlasIntegrationTest.java rename to metrics/src/test/java/com/baeldung/metrics/micrometer/MicrometerAtlasManualTest.java index 02ef926794..8341befb83 100644 --- a/metrics/src/test/java/com/baeldung/metrics/micrometer/MicrometerAtlasIntegrationTest.java +++ b/metrics/src/test/java/com/baeldung/metrics/micrometer/MicrometerAtlasManualTest.java @@ -37,7 +37,7 @@ import com.netflix.spectator.atlas.AtlasConfig; /** * @author aiet */ -public class MicrometerAtlasIntegrationTest { +public class MicrometerAtlasManualTest { private AtlasConfig atlasConfig; diff --git a/persistence-modules/fauna/pom.xml b/persistence-modules/fauna/pom.xml index 2f5da68ede..8c985e0b7c 100644 --- a/persistence-modules/fauna/pom.xml +++ b/persistence-modules/fauna/pom.xml @@ -9,11 +9,11 @@ fauna Blogging Service built with FaunaDB - - org.springframework.boot - spring-boot-starter-parent - 2.6.2 - + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 @@ -54,6 +54,7 @@ 17 + 3.17.0 \ No newline at end of file diff --git a/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/detachedentity/HibernateUtil.java b/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/detachedentity/HibernateUtil.java index 0420755354..a7b1f496d9 100644 --- a/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/detachedentity/HibernateUtil.java +++ b/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/detachedentity/HibernateUtil.java @@ -24,7 +24,8 @@ public class HibernateUtil { settings.put(Environment.USER, "sa"); settings.put(Environment.PASS, ""); settings.put(Environment.DIALECT, "org.hibernate.dialect.HSQLDialect"); - settings.put(Environment.SHOW_SQL, "true"); + // enable to show Hibernate generated SQL + settings.put(Environment.SHOW_SQL, "false"); settings.put(Environment.FORMAT_SQL, "true"); settings.put(Environment.USE_SQL_COMMENTS, "true"); settings.put(Environment.HBM2DDL_AUTO, "update"); diff --git a/testing-modules/mockito-2/src/main/resources/logback.xml b/persistence-modules/hibernate-exceptions/src/test/resources/logback-test.xml similarity index 59% rename from testing-modules/mockito-2/src/main/resources/logback.xml rename to persistence-modules/hibernate-exceptions/src/test/resources/logback-test.xml index 7d900d8ea8..5d5620b2c1 100644 --- a/testing-modules/mockito-2/src/main/resources/logback.xml +++ b/persistence-modules/hibernate-exceptions/src/test/resources/logback-test.xml @@ -2,11 +2,14 @@ - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - + [%d{ISO8601}]-[%thread] %-5level %logger - %msg%n + + + + diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/count/SpringBootCountApplication.java b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/count/SpringBootCountApplication.java new file mode 100644 index 0000000000..bb7351383c --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/count/SpringBootCountApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.boot.count; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; + +@SpringBootApplication +@EnableMongoRepositories(basePackages = { "com.baeldung.boot.count" }) +public class SpringBootCountApplication { + public static void main(String... args) { + SpringApplication.run(SpringBootCountApplication.class, args); + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/count/dao/CarRepository.java b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/count/dao/CarRepository.java new file mode 100644 index 0000000000..b03298852e --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/count/dao/CarRepository.java @@ -0,0 +1,16 @@ +package com.baeldung.boot.count.dao; + +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.data.mongodb.repository.Query; + +import com.baeldung.boot.count.data.Car; + +public interface CarRepository extends MongoRepository { + @Query(value = "{brand: ?0}", count = true) + public long countBrand(String brand); + + Long countByBrand(String brand); + + @Query(value = "{}", count = true) + Long countWithAnnotation(); +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/count/data/Car.java b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/count/data/Car.java new file mode 100644 index 0000000000..42b80d70b0 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/count/data/Car.java @@ -0,0 +1,33 @@ +package com.baeldung.boot.count.data; + +import org.springframework.data.mongodb.core.mapping.Document; + +@Document +public class Car { + private String name; + + private String brand; + + public Car() { + } + + public Car(String brand) { + this.brand = brand; + } + + public String getBrand() { + return brand; + } + + public void setBrand(String brand) { + this.brand = brand; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/count/service/CountCarService.java b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/count/service/CountCarService.java new file mode 100644 index 0000000000..d4685847fb --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-2/src/main/java/com/baeldung/boot/count/service/CountCarService.java @@ -0,0 +1,69 @@ +package com.baeldung.boot.count.service; + +import java.util.List; +import java.util.Optional; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Example; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; + +import com.baeldung.boot.count.dao.CarRepository; +import com.baeldung.boot.count.data.Car; + +@Service +public class CountCarService { + + @Autowired + private CarRepository repo; + + @Autowired + private MongoTemplate mongo; + + public List findCars() { + return repo.findAll(); + } + + public Optional findCar(String id) { + return repo.findById(id); + } + + public Car insertCar(Car item) { + return repo.insert(item); + } + + public long getCountWithQueryAnnotation() { + return repo.countWithAnnotation(); + } + + public long getCountWithCrudRepository() { + return repo.count(); + } + + public long getCountBrandWithQueryMethod(String brand) { + return repo.countByBrand(brand); + } + + public long getCountWithExample(Car item) { + return repo.count(Example.of(item)); + } + + public long getCountWithExampleCriteria(Car item) { + Query query = new Query(); + query.addCriteria(Criteria.byExample(item)); + return mongo.count(query, Car.class); + } + + public long getCountBrandWithQueryAnnotation(String brand) { + return repo.countBrand(brand); + } + + public long getCountBrandWithCriteria(String brand) { + Query query = new Query(); + query.addCriteria(Criteria.where("brand") + .is(brand)); + return mongo.count(query, Car.class); + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/src/test/java/com/baeldung/boot/count/service/CountCarServiceIntegrationTest.java b/persistence-modules/spring-boot-persistence-mongodb-2/src/test/java/com/baeldung/boot/count/service/CountCarServiceIntegrationTest.java new file mode 100644 index 0000000000..421ecd3a34 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-2/src/test/java/com/baeldung/boot/count/service/CountCarServiceIntegrationTest.java @@ -0,0 +1,118 @@ +package com.baeldung.boot.count.service; + +import static org.junit.Assert.assertEquals; + +import java.util.List; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.boot.count.data.Car; + +@SpringBootTest +@DirtiesContext +@RunWith(SpringRunner.class) +public class CountCarServiceIntegrationTest { + @Autowired + private CountCarService service; + + Car car1 = new Car("B-A"); + + @Before + public void init() { + service.insertCar(car1); + service.insertCar(new Car("B-B")); + service.insertCar(new Car("B-C")); + } + + @Test + public void givenAllDocs_whenQueryAnnotationCount_thenCountEqualsSize() { + List all = service.findCars(); + + long count = service.getCountWithQueryAnnotation(); + + assertEquals(count, all.size()); + } + + @Test + public void givenAllDocs_whenCrudRepositoryCount_thenCountEqualsSize() { + List all = service.findCars(); + + long count = service.getCountWithCrudRepository(); + + assertEquals(count, all.size()); + } + + @Test + public void givenFilteredDocs_whenCriteriaCountByBrand_thenCountEqualsSize() { + String filter = "B-A"; + long all = service.findCars() + .stream() + .filter(car -> car.getBrand() + .equals(filter)) + .count(); + + long count = service.getCountBrandWithCriteria(filter); + + assertEquals(count, all); + } + + @Test + public void givenQueryAnnotation_whenCountingByBrand_thenCountEqualsSize() { + String filter = "B-A"; + long all = service.findCars() + .stream() + .filter(car -> car.getBrand() + .equals(filter)) + .count(); + + long count = service.getCountBrandWithQueryAnnotation(filter); + + assertEquals(count, all); + } + + @Test + public void givenFilteredDocs_whenQueryMethodCountByBrand_thenCountEqualsSize() { + String filter = "B-A"; + long all = service.findCars() + .stream() + .filter(car -> car.getBrand() + .equals(filter)) + .count(); + + long count = service.getCountBrandWithQueryMethod(filter); + + assertEquals(count, all); + } + + @Test + public void givenFilteredDocs_whenExampleCount_thenCountEqualsSize() { + long all = service.findCars() + .stream() + .filter(car -> car.getBrand() + .equals(car1.getBrand())) + .count(); + + long count = service.getCountWithExample(car1); + + assertEquals(count, all); + } + + @Test + public void givenFilteredDocs_whenExampleCriteriaCount_thenCountEqualsSize() { + long all = service.findCars() + .stream() + .filter(car -> car.getBrand() + .equals(car1.getBrand())) + .count(); + + long count = service.getCountWithExampleCriteria(car1); + + assertEquals(count, all); + } +} diff --git a/persistence-modules/spring-data-jpa-enterprise/pom.xml b/persistence-modules/spring-data-jpa-enterprise/pom.xml index 587261dccc..16294cd3cc 100644 --- a/persistence-modules/spring-data-jpa-enterprise/pom.xml +++ b/persistence-modules/spring-data-jpa-enterprise/pom.xml @@ -87,7 +87,7 @@ 1.3.1.Final - 1.12.2 + 1.17.3 \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/application-tc-jdbc.yml b/persistence-modules/spring-data-jpa-enterprise/src/test/resources/application-tc-jdbc.yml index ad5906fa6e..d340e29bd0 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/application-tc-jdbc.yml +++ b/persistence-modules/spring-data-jpa-enterprise/src/test/resources/application-tc-jdbc.yml @@ -1,6 +1,7 @@ spring: datasource: url: jdbc:tc:postgresql:11.1:///integration-tests-db + driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver jpa: hibernate: ddl-auto: create \ No newline at end of file diff --git a/spring-5-reactive-modules/spring-5-reactive-3/src/main/java/com/baeldung/databuffer/DataBufferToInputStream.java b/spring-5-reactive-modules/spring-5-reactive-3/src/main/java/com/baeldung/databuffer/DataBufferToInputStream.java new file mode 100644 index 0000000000..82f0658f51 --- /dev/null +++ b/spring-5-reactive-modules/spring-5-reactive-3/src/main/java/com/baeldung/databuffer/DataBufferToInputStream.java @@ -0,0 +1,94 @@ +package com.baeldung.databuffer; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.core.io.buffer.DataBufferUtils; +import org.springframework.web.reactive.function.BodyExtractors; +import org.springframework.web.reactive.function.client.WebClient; + +import reactor.core.publisher.Flux; + +import java.io.IOException; +import java.io.InputStream; +import java.io.PipedInputStream; +import java.io.PipedOutputStream; + +public class DataBufferToInputStream { + private static final Logger logger = LoggerFactory.getLogger(DataBufferToInputStream.class); + private static final String REQUEST_ENDPOINT = "https://gorest.co.in/public/v2/users"; + + private static WebClient getWebClient() { + WebClient.Builder webClientBuilder = WebClient.builder(); + return webClientBuilder.build(); + } + + public static InputStream getResponseAsInputStream(WebClient client, String url) throws IOException, InterruptedException { + + PipedOutputStream pipedOutputStream = new PipedOutputStream(); + PipedInputStream pipedInputStream = new PipedInputStream(1024 * 10); + pipedInputStream.connect(pipedOutputStream); + + Flux body = client.get() + .uri(url) + .exchangeToFlux(clientResponse -> { + return clientResponse.body(BodyExtractors.toDataBuffers()); + }) + .doOnError(error -> { + logger.error("error occurred while reading body", error); + }) + .doFinally(s -> { + try { + pipedOutputStream.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + }) + .doOnCancel(() -> { + logger.error("Get request is cancelled"); + }); + + DataBufferUtils.write(body, pipedOutputStream) + .log("Writing to output buffer") + .subscribe(); + return pipedInputStream; + } + + private static String readContentFromPipedInputStream(PipedInputStream stream) throws IOException { + StringBuffer contentStringBuffer = new StringBuffer(); + try { + Thread pipeReader = new Thread(() -> { + try { + contentStringBuffer.append(readContent(stream)); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + pipeReader.start(); + pipeReader.join(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } finally { + stream.close(); + } + + return String.valueOf(contentStringBuffer); + } + + private static String readContent(InputStream stream) throws IOException { + StringBuffer contentStringBuffer = new StringBuffer(); + byte[] tmp = new byte[stream.available()]; + int byteCount = stream.read(tmp, 0, tmp.length); + logger.info(String.format("read %d bytes from the stream\n", byteCount)); + contentStringBuffer.append(new String(tmp)); + return String.valueOf(contentStringBuffer); + } + + public static void main(String[] args) throws IOException, InterruptedException { + WebClient webClient = getWebClient(); + InputStream inputStream = getResponseAsInputStream(webClient, REQUEST_ENDPOINT); + Thread.sleep(3000); + String content = readContentFromPipedInputStream((PipedInputStream) inputStream); + logger.info("response content: \n{}", content.replace("}", "}\n")); + } +} diff --git a/spring-5-reactive-modules/spring-5-reactive-3/src/test/java/databuffer/DataBufferToInputStreamUnitTest.java b/spring-5-reactive-modules/spring-5-reactive-3/src/test/java/databuffer/DataBufferToInputStreamUnitTest.java new file mode 100644 index 0000000000..b885919bbb --- /dev/null +++ b/spring-5-reactive-modules/spring-5-reactive-3/src/test/java/databuffer/DataBufferToInputStreamUnitTest.java @@ -0,0 +1,77 @@ +package databuffer; + +import com.baeldung.databuffer.DataBufferToInputStream; + +import io.restassured.internal.util.IOUtils; + +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.http.HttpStatus; +import org.springframework.web.reactive.function.client.ClientResponse; +import org.springframework.web.reactive.function.client.ExchangeFunction; +import org.springframework.web.reactive.function.client.WebClient; + +import reactor.core.publisher.Mono; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.stream.Collectors; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; + +class DataBufferToInputStreamUnitTest { + private String getResponseStub() throws IOException { + InputStream inputStream = null; + BufferedReader reader = null; + String content = null; + try { + inputStream = this.getClass() + .getClassLoader() + .getResourceAsStream("user-response.json"); + if (inputStream != null) { + reader = new BufferedReader(new InputStreamReader(inputStream)); + content = reader.lines() + .collect(Collectors.joining(System.lineSeparator())); + } + } catch (Exception ex) { + throw new RuntimeException("exception caught while getting response stub"); + } finally { + reader.close(); + inputStream.close(); + } + return content; + } + + private InputStream getResponseStubAsInputStream() { + return this.getClass() + .getClassLoader() + .getResourceAsStream("user-response.json"); + } + + private WebClient getMockWebClient() throws IOException { + String content = getResponseStub(); + ClientResponse clientResponse = ClientResponse.create(HttpStatus.OK) + .header("Content-Type", "application/json") + .body(content) + .build(); + + ExchangeFunction exchangeFunction = clientRequest -> Mono.just(clientResponse); + + WebClient.Builder webClientBuilder = WebClient.builder() + .exchangeFunction(exchangeFunction); + WebClient webClient = webClientBuilder.build(); + return webClient; + } + + @Test + public void testResponseAsInputStream() throws IOException, InterruptedException { + String mockUrl = Mockito.anyString(); + WebClient mockWebClient = getMockWebClient(); + InputStream inputStream = DataBufferToInputStream.getResponseAsInputStream(mockWebClient, mockUrl); + byte[] expectedBytes = IOUtils.toByteArray(getResponseStubAsInputStream()); + byte[] actualBytes = IOUtils.toByteArray(inputStream); + assertArrayEquals(expectedBytes, actualBytes); + } +} \ No newline at end of file diff --git a/spring-5-reactive-modules/spring-5-reactive-3/src/test/resources/user-response.json b/spring-5-reactive-modules/spring-5-reactive-3/src/test/resources/user-response.json new file mode 100644 index 0000000000..33c03dc492 --- /dev/null +++ b/spring-5-reactive-modules/spring-5-reactive-3/src/test/resources/user-response.json @@ -0,0 +1,72 @@ +[ + { + "id": 2683, + "name": "Maheswar Kocchar", + "email": "maheswar_kocchar@kihn.info", + "gender": "male", + "status": "active" + }, + { + "id": 2680, + "name": "Lakshminath Khan", + "email": "lakshminath_khan@barrows-cormier.biz", + "gender": "female", + "status": "inactive" + }, + { + "id": 2679, + "name": "Tarun Arora", + "email": "tarun_arora@rolfson.net", + "gender": "female", + "status": "inactive" + }, + { + "id": 2678, + "name": "Agnivesh Dubashi", + "email": "dubashi_agnivesh@senger.name", + "gender": "male", + "status": "inactive" + }, + { + "id": 2677, + "name": "Dhanu Gowda", + "email": "gowda_dhanu@hayes.org", + "gender": "male", + "status": "active" + }, + { + "id": 2675, + "name": "Harinakshi Pilla Jr.", + "email": "pilla_jr_harinakshi@rutherford-monahan.com", + "gender": "female", + "status": "inactive" + }, + { + "id": 2673, + "name": "Kalpana Prajapat", + "email": "prajapat_kalpana@wilkinson-schaefer.net", + "gender": "female", + "status": "active" + }, + { + "id": 2672, + "name": "Chakradhar Jha", + "email": "jha_chakradhar@baumbach.info", + "gender": "male", + "status": "active" + }, + { + "id": 2670, + "name": "Divaakar Deshpande Jr.", + "email": "deshpande_jr_divaakar@mertz.info", + "gender": "female", + "status": "inactive" + }, + { + "id": 2669, + "name": "Prasanna Mehra", + "email": "prasanna_mehra@ruecker-larkin.name", + "gender": "female", + "status": "active" + } +] \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-libraries-2/pom.xml b/spring-boot-modules/spring-boot-libraries-2/pom.xml index f62a341efc..79c090dde5 100644 --- a/spring-boot-modules/spring-boot-libraries-2/pom.xml +++ b/spring-boot-modules/spring-boot-libraries-2/pom.xml @@ -62,6 +62,16 @@ spqr 0.11.2 + + org.reflections + reflections + 0.10.2 + + + org.jboss + jandex + 2.4.3.Final + @@ -92,6 +102,27 @@ + + org.jboss.jandex + jandex-maven-plugin + 1.2.3 + + + compile + make-index + + jandex + + + + + ${project.build.outputDirectory} + + + + + + diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/SampleAnnotatedClass.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/SampleAnnotatedClass.java new file mode 100644 index 0000000000..64849d6a3a --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/SampleAnnotatedClass.java @@ -0,0 +1,14 @@ +package com.baeldung.annotation.scanner; + +@SampleAnnotation(name = "SampleAnnotatedClass") +public class SampleAnnotatedClass { + + @SampleAnnotation(name = "annotatedMethod") + public void annotatedMethod() { + //Do something + } + + public void notAnnotatedMethod() { + //Do something + } +} diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/SampleAnnotation.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/SampleAnnotation.java new file mode 100644 index 0000000000..212e12e910 --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/SampleAnnotation.java @@ -0,0 +1,14 @@ +package com.baeldung.annotation.scanner; + +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +@Target({ METHOD, TYPE }) +@Retention(RUNTIME) +public @interface SampleAnnotation { + String name(); +} diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/SampleAnnotationScanner.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/SampleAnnotationScanner.java new file mode 100644 index 0000000000..5cc9a2e8b3 --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/SampleAnnotationScanner.java @@ -0,0 +1,13 @@ +package com.baeldung.annotation.scanner; + +import java.util.List; + +public interface SampleAnnotationScanner { + List scanAnnotatedMethods(); + + List scanAnnotatedClasses(); + + boolean supportsMethodScan(); + + boolean supportsClassScan(); +} diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/ScanNotSupportedException.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/ScanNotSupportedException.java new file mode 100644 index 0000000000..1566dc3fad --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/ScanNotSupportedException.java @@ -0,0 +1,4 @@ +package com.baeldung.annotation.scanner; + +public class ScanNotSupportedException extends RuntimeException{ +} diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/UnexpectedScanException.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/UnexpectedScanException.java new file mode 100644 index 0000000000..bd7c129bfd --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/UnexpectedScanException.java @@ -0,0 +1,7 @@ +package com.baeldung.annotation.scanner; + +public class UnexpectedScanException extends RuntimeException { + public UnexpectedScanException(Throwable ex) { + super(ex); + } +} diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/jandexlib/JandexScannerService.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/jandexlib/JandexScannerService.java new file mode 100644 index 0000000000..fc10db223e --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/jandexlib/JandexScannerService.java @@ -0,0 +1,76 @@ +package com.baeldung.annotation.scanner.jandexlib; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.jboss.jandex.AnnotationInstance; +import org.jboss.jandex.AnnotationTarget; +import org.jboss.jandex.DotName; +import org.jboss.jandex.Index; +import org.jboss.jandex.IndexReader; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.Resource; +import org.springframework.stereotype.Service; + +import com.baeldung.annotation.scanner.SampleAnnotationScanner; +import com.baeldung.annotation.scanner.UnexpectedScanException; + +@Service +public class JandexScannerService implements SampleAnnotationScanner { + @Value("classpath:META-INF/jandex.idx") + private Resource appFile; + + @Override + public List scanAnnotatedMethods() { + try { + final IndexReader reader = new IndexReader(appFile.getInputStream()); + Index jandexFile = reader.read(); + final List appAnnotationList = jandexFile.getAnnotations(DotName.createSimple("com.baeldung.annotation.scanner.SampleAnnotation")); + List annotatedMethods = new ArrayList<>(); + for (AnnotationInstance annotationInstance : appAnnotationList) { + if (annotationInstance.target() + .kind() == AnnotationTarget.Kind.METHOD) { + annotatedMethods.add(annotationInstance.value("name") + .value() + .toString()); + } + } + return Collections.unmodifiableList(annotatedMethods); + } catch (IOException e) { + throw new UnexpectedScanException(e); + } + } + + @Override + public List scanAnnotatedClasses() { + try { + final IndexReader reader = new IndexReader(appFile.getInputStream()); + Index jandexFile = reader.read(); + final List appAnnotationList = jandexFile.getAnnotations(DotName.createSimple("com.baeldung.annotation.scanner.SampleAnnotation")); + List annotatedClasses = new ArrayList<>(); + for (AnnotationInstance annotationInstance : appAnnotationList) { + if (annotationInstance.target() + .kind() == AnnotationTarget.Kind.CLASS) { + annotatedClasses.add(annotationInstance.value("name") + .value() + .toString()); + } + } + return Collections.unmodifiableList(annotatedClasses); + } catch (IOException e) { + throw new UnexpectedScanException(e); + } + } + + @Override + public boolean supportsMethodScan() { + return true; + } + + @Override + public boolean supportsClassScan() { + return true; + } +} diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/javareflectionlib/JavaReflectionsScannerService.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/javareflectionlib/JavaReflectionsScannerService.java new file mode 100644 index 0000000000..2833bb1326 --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/javareflectionlib/JavaReflectionsScannerService.java @@ -0,0 +1,58 @@ +package com.baeldung.annotation.scanner.javareflectionlib; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.springframework.stereotype.Service; + +import com.baeldung.annotation.scanner.SampleAnnotation; +import com.baeldung.annotation.scanner.SampleAnnotationScanner; +import com.baeldung.annotation.scanner.UnexpectedScanException; + +@Service +public class JavaReflectionsScannerService implements SampleAnnotationScanner { + @Override + public List scanAnnotatedMethods() { + try { + Class clazz = ClassLoader.getSystemClassLoader() + .loadClass("com.baeldung.annotation.scanner.SampleAnnotatedClass"); + Method[] methods = clazz.getMethods(); + List annotatedMethods = new ArrayList<>(); + for (Method method : methods) { + SampleAnnotation annotation = method.getAnnotation(SampleAnnotation.class); + if (annotation != null) { + annotatedMethods.add(annotation.name()); + } + } + return Collections.unmodifiableList(annotatedMethods); + } catch (ClassNotFoundException e) { + throw new UnexpectedScanException(e); + } + } + + @Override + public List scanAnnotatedClasses() { + try { + Class clazz = ClassLoader.getSystemClassLoader() + .loadClass("com.baeldung.annotation.scanner.SampleAnnotatedClass"); + SampleAnnotation classAnnotation = clazz.getAnnotation(SampleAnnotation.class); + List annotatedClasses = new ArrayList<>(); + annotatedClasses.add(classAnnotation.name()); + return Collections.unmodifiableList(annotatedClasses); + } catch (ClassNotFoundException e) { + throw new UnexpectedScanException(e); + } + } + + @Override + public boolean supportsMethodScan() { + return true; + } + + @Override + public boolean supportsClassScan() { + return true; + } +} diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/reflectionslib/ReflectionsScannerService.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/reflectionslib/ReflectionsScannerService.java new file mode 100644 index 0000000000..82a10e21aa --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/reflectionslib/ReflectionsScannerService.java @@ -0,0 +1,45 @@ +package com.baeldung.annotation.scanner.reflectionslib; + +import java.lang.reflect.Method; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import org.reflections.Reflections; +import org.springframework.stereotype.Service; + +import com.baeldung.annotation.scanner.SampleAnnotation; +import com.baeldung.annotation.scanner.SampleAnnotationScanner; + +@Service +public class ReflectionsScannerService implements SampleAnnotationScanner { + @Override + public List scanAnnotatedMethods() { + Reflections reflections = new Reflections("com.baeldung.annotation.scanner"); + Set methods = reflections.getMethodsAnnotatedWith(SampleAnnotation.class); + return methods.stream() + .map(method -> method.getAnnotation(SampleAnnotation.class) + .name()) + .collect(Collectors.toList()); + } + + @Override + public List scanAnnotatedClasses() { + Reflections reflections = new Reflections("com.baeldung.annotation.scanner"); + Set> types = reflections.getTypesAnnotatedWith(SampleAnnotation.class); + return types.stream() + .map(clazz -> clazz.getAnnotation(SampleAnnotation.class) + .name()) + .collect(Collectors.toList()); + } + + @Override + public boolean supportsMethodScan() { + return true; + } + + @Override + public boolean supportsClassScan() { + return true; + } +} diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/springcontextlib/SpringBeanAnnotationScannerService.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/springcontextlib/SpringBeanAnnotationScannerService.java new file mode 100644 index 0000000000..cd31ae686e --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/springcontextlib/SpringBeanAnnotationScannerService.java @@ -0,0 +1,52 @@ +package com.baeldung.annotation.scanner.springcontextlib; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; +import org.springframework.core.type.filter.AnnotationTypeFilter; +import org.springframework.stereotype.Service; + +import com.baeldung.annotation.scanner.SampleAnnotation; +import com.baeldung.annotation.scanner.SampleAnnotationScanner; +import com.baeldung.annotation.scanner.ScanNotSupportedException; + +@Service +public class SpringBeanAnnotationScannerService implements SampleAnnotationScanner { + @Override + public List scanAnnotatedMethods() { + throw new ScanNotSupportedException(); + } + + @Override + public List scanAnnotatedClasses() { + ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false); + provider.addIncludeFilter(new AnnotationTypeFilter(SampleAnnotation.class)); + Set beanDefs = provider.findCandidateComponents("com.baeldung.annotation.scanner"); + List annotatedBeans = new ArrayList<>(); + for (BeanDefinition bd : beanDefs) { + if (bd instanceof AnnotatedBeanDefinition) { + Map annotAttributeMap = ((AnnotatedBeanDefinition) bd).getMetadata() + .getAnnotationAttributes(SampleAnnotation.class.getCanonicalName()); + annotatedBeans.add(annotAttributeMap.get("name") + .toString()); + } + } + return Collections.unmodifiableList(annotatedBeans); + } + + @Override + public boolean supportsMethodScan() { + return false; + } + + @Override + public boolean supportsClassScan() { + return true; + } +} diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/springcorelib/SpringCoreAnnotationScannerService.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/springcorelib/SpringCoreAnnotationScannerService.java new file mode 100644 index 0000000000..f3421fe46d --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/springcorelib/SpringCoreAnnotationScannerService.java @@ -0,0 +1,42 @@ +package com.baeldung.annotation.scanner.springcorelib; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.ClassUtils; + +import com.baeldung.annotation.scanner.SampleAnnotationScanner; +import com.baeldung.annotation.scanner.SampleAnnotatedClass; +import com.baeldung.annotation.scanner.SampleAnnotation; +import com.baeldung.annotation.scanner.ScanNotSupportedException; + +@Service +public class SpringCoreAnnotationScannerService implements SampleAnnotationScanner { + @Override + public List scanAnnotatedMethods() { + final Class userClass = ClassUtils.getUserClass(SampleAnnotatedClass.class); + return Arrays.stream(userClass.getMethods()) + .filter(method -> AnnotationUtils.getAnnotation(method, SampleAnnotation.class) != null) + .map(method -> method.getAnnotation(SampleAnnotation.class) + .name()) + .collect(Collectors.toList()); + } + + @Override + public List scanAnnotatedClasses() { + throw new ScanNotSupportedException(); + } + + @Override + public boolean supportsMethodScan() { + return true; + } + + @Override + public boolean supportsClassScan() { + return false; + } +} diff --git a/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/annotation/scanner/SampleAnnotationScannerUnitTest.java b/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/annotation/scanner/SampleAnnotationScannerUnitTest.java new file mode 100644 index 0000000000..80eca2b4c5 --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/annotation/scanner/SampleAnnotationScannerUnitTest.java @@ -0,0 +1,47 @@ +package com.baeldung.annotation.scanner; + +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.junit.Assert.*; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class SampleAnnotationScannerUnitTest { + @Autowired + private List scannerList; + + @Test + public void givenPackage_whenScanAnnotatedClasses_thenAnnotationValues() { + final List annotatedClasses = scannerList.stream() + .filter(SampleAnnotationScanner::supportsClassScan) + .map(SampleAnnotationScanner::scanAnnotatedClasses) + .flatMap(Collection::stream) + .collect(Collectors.toList()); + + assertNotNull(annotatedClasses); + assertEquals(4, annotatedClasses.size()); + annotatedClasses.forEach(annotValue -> assertEquals("SampleAnnotatedClass", annotValue)); + } + + @Test + public void givenPackage_whenScanAnnotatedMethods_thenAnnotationValues() { + final List annotatedMethods = scannerList.stream() + .filter(SampleAnnotationScanner::supportsMethodScan) + .map(SampleAnnotationScanner::scanAnnotatedMethods) + .flatMap(Collection::stream) + .collect(Collectors.toList()); + + assertNotNull(annotatedMethods); + assertEquals(3, annotatedMethods.size()); + annotatedMethods.forEach(annotValue -> assertEquals("annotatedMethod", annotValue)); + } + +} diff --git a/spring-boot-modules/spring-boot-mvc-3/pom.xml b/spring-boot-modules/spring-boot-mvc-3/pom.xml index 43a492786e..f2b6c129f8 100644 --- a/spring-boot-modules/spring-boot-mvc-3/pom.xml +++ b/spring-boot-modules/spring-boot-mvc-3/pom.xml @@ -40,6 +40,18 @@ commons-io ${commons-io.version} + + org.springframework.boot + spring-boot-starter-test + test + + + + + /src/main/resources + + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/produceimage/controller/DataProducerController.java b/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/produceimage/controller/DataProducerController.java index ab233a8b60..218be68a45 100644 --- a/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/produceimage/controller/DataProducerController.java +++ b/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/produceimage/controller/DataProducerController.java @@ -1,9 +1,12 @@ package com.baeldung.produceimage.controller; import org.apache.commons.io.IOUtils; +import org.springframework.core.io.InputStreamResource; import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import java.io.IOException; @@ -29,6 +32,18 @@ public class DataProducerController { return IOUtils.toByteArray(in); } + @GetMapping("/get-image-dynamic-type") + @ResponseBody + public ResponseEntity getImageDynamicType(@RequestParam("jpg") boolean jpg) { + final MediaType contentType = jpg ? MediaType.IMAGE_JPEG : MediaType.IMAGE_PNG; + final InputStream in = jpg ? + getClass().getResourceAsStream("/com/baeldung/produceimage/image.jpg") : + getClass().getResourceAsStream("/com/baeldung/produceimage/image.png"); + return ResponseEntity.ok() + .contentType(contentType) + .body(new InputStreamResource(in)); + } + @GetMapping(value = "/get-file", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) public @ResponseBody byte[] getFile() throws IOException { final InputStream in = getClass().getResourceAsStream("/com/baeldung/produceimage/data.txt"); diff --git a/spring-boot-modules/spring-boot-mvc-3/src/main/resources/com/baeldung/produceimage/data.txt b/spring-boot-modules/spring-boot-mvc-3/src/main/resources/com/baeldung/produceimage/data.txt new file mode 100644 index 0000000000..5a8297fc5e --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-3/src/main/resources/com/baeldung/produceimage/data.txt @@ -0,0 +1 @@ +Hello Baeldung! \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc-3/src/main/resources/com/baeldung/produceimage/image.jpg b/spring-boot-modules/spring-boot-mvc-3/src/main/resources/com/baeldung/produceimage/image.jpg new file mode 100644 index 0000000000..db3abce0d6 Binary files /dev/null and b/spring-boot-modules/spring-boot-mvc-3/src/main/resources/com/baeldung/produceimage/image.jpg differ diff --git a/spring-boot-modules/spring-boot-mvc-3/src/main/resources/com/baeldung/produceimage/image.png b/spring-boot-modules/spring-boot-mvc-3/src/main/resources/com/baeldung/produceimage/image.png new file mode 100644 index 0000000000..16d218e334 Binary files /dev/null and b/spring-boot-modules/spring-boot-mvc-3/src/main/resources/com/baeldung/produceimage/image.png differ diff --git a/spring-boot-modules/spring-boot-mvc-3/src/test/java/com/baeldung/produceimage/DataProducerControllerIntegrationTest.java b/spring-boot-modules/spring-boot-mvc-3/src/test/java/com/baeldung/produceimage/DataProducerControllerIntegrationTest.java new file mode 100644 index 0000000000..29f794645a --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-3/src/test/java/com/baeldung/produceimage/DataProducerControllerIntegrationTest.java @@ -0,0 +1,46 @@ +package com.baeldung.produceimage; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import org.springframework.web.context.WebApplicationContext; + +@SpringBootTest(classes = ImageApplication.class, + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class DataProducerControllerIntegrationTest { + + @Autowired + private WebApplicationContext webApplicationContext; + + private MockMvc mockMvc; + + @BeforeEach + public void setup() { + this.mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); + } + + @Test + void givenJpgTrue_whenGetImageDynamicType_ThenContentTypeIsJpg() throws Exception { + mockMvc.perform(get("/get-image-dynamic-type?jpg=true")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.IMAGE_JPEG)) + .andExpect(header().stringValues(HttpHeaders.CONTENT_TYPE, MediaType.IMAGE_JPEG_VALUE)); + } + + @Test + void givenJpgFalse_whenGetImageDynamicType_ThenContentTypeIsFalse() throws Exception { + mockMvc.perform(get("/get-image-dynamic-type?jpg=false")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.IMAGE_PNG)) + .andExpect(header().stringValues(HttpHeaders.CONTENT_TYPE, MediaType.IMAGE_PNG_VALUE)); + } + +} diff --git a/spring-boot-modules/spring-boot-mvc-3/src/test/java/com/baeldung/springvalidation/UserAccountUnitTest.java b/spring-boot-modules/spring-boot-mvc-3/src/test/java/com/baeldung/springvalidation/UserAccountIntegrationTest.java similarity index 84% rename from spring-boot-modules/spring-boot-mvc-3/src/test/java/com/baeldung/springvalidation/UserAccountUnitTest.java rename to spring-boot-modules/spring-boot-mvc-3/src/test/java/com/baeldung/springvalidation/UserAccountIntegrationTest.java index 507321bf8e..7c23153951 100644 --- a/spring-boot-modules/spring-boot-mvc-3/src/test/java/com/baeldung/springvalidation/UserAccountUnitTest.java +++ b/spring-boot-modules/spring-boot-mvc-3/src/test/java/com/baeldung/springvalidation/UserAccountIntegrationTest.java @@ -1,9 +1,7 @@ package com.baeldung.springvalidation; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -15,7 +13,7 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @AutoConfigureMockMvc -public class UserAccountUnitTest { +public class UserAccountIntegrationTest { @Autowired private MockMvc mockMvc; @@ -46,10 +44,8 @@ public class UserAccountUnitTest { public void givenSaveBasicInfoStep1_whenIncorrectInput_thenError() throws Exception { this.mockMvc.perform(MockMvcRequestBuilders.post("/saveBasicInfoStep1") .accept(MediaType.TEXT_HTML)) - // .param("name", "test123") - // .param("password", "pass")) .andExpect(model().errorCount(2)) - // .andExpect(view().name("error")) + .andExpect(view().name("error")) .andExpect(status().isOk()) .andDo(print()); } diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/DefaultGlobalSecuritySchemeApplication.java b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/DefaultGlobalSecuritySchemeApplication.java new file mode 100644 index 0000000000..1ce81a1e83 --- /dev/null +++ b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/DefaultGlobalSecuritySchemeApplication.java @@ -0,0 +1,32 @@ +package com.baeldung.defaultglobalsecurityscheme; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.web.SecurityFilterChain; + +import io.swagger.v3.oas.annotations.OpenAPIDefinition; +import io.swagger.v3.oas.annotations.enums.SecuritySchemeIn; +import io.swagger.v3.oas.annotations.enums.SecuritySchemeType; +import io.swagger.v3.oas.annotations.info.Info; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.security.SecurityScheme; + +@SpringBootApplication +@OpenAPIDefinition(info = @Info(title = "Apply Default Global SecurityScheme in springdoc-openapi", version = "1.0.0"), security = { @SecurityRequirement(name = "api_key") }) +@SecurityScheme(type = SecuritySchemeType.APIKEY, name = "api_key", in = SecuritySchemeIn.HEADER) +public class DefaultGlobalSecuritySchemeApplication { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + return http.authorizeHttpRequests(authorizeRequests -> authorizeRequests.antMatchers("/api/auth/**", "/swagger-ui-custom.html", "/swagger-ui.html", "/swagger-ui/**", "/v3/api-docs/**", "/webjars/**", "/swagger-ui/index.html", "/api-docs/**") + .permitAll() + .anyRequest() + .authenticated()) + .build(); + } + + public static void main(String[] args) { + SpringApplication.run(DefaultGlobalSecuritySchemeApplication.class, args); + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/controller/DefaultGlobalSecuritySchemeOpenApiController.java b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/controller/DefaultGlobalSecuritySchemeOpenApiController.java new file mode 100644 index 0000000000..4ad7a2a2c3 --- /dev/null +++ b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/controller/DefaultGlobalSecuritySchemeOpenApiController.java @@ -0,0 +1,61 @@ +package com.baeldung.defaultglobalsecurityscheme.controller; + +import java.time.OffsetDateTime; +import java.time.ZoneOffset; + +import javax.validation.Valid; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.defaultglobalsecurityscheme.dto.LoginDto; +import com.baeldung.defaultglobalsecurityscheme.dto.ApplicationExceptionDto; +import com.baeldung.defaultglobalsecurityscheme.dto.PingResponseDto; +import com.baeldung.defaultglobalsecurityscheme.dto.TokenDto; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.security.SecurityRequirements; + +@RestController +@RequestMapping("/") +public class DefaultGlobalSecuritySchemeOpenApiController { + @RequestMapping(method = RequestMethod.POST, value = "/login", produces = { "application/json" }, consumes = { "application/json" }) + @Operation(operationId = "login", responses = { + @ApiResponse(responseCode = "200", description = "api_key to be used in the secured-ping entry point", content = { @Content(mediaType = "application/json", schema = @Schema(implementation = TokenDto.class)) }), + @ApiResponse(responseCode = "401", description = "Unauthorized request", content = { @Content(mediaType = "application/json", schema = @Schema(implementation = ApplicationExceptionDto.class)) }) }) + @SecurityRequirements() + public ResponseEntity login(@Parameter(name = "LoginDto", description = "Login") @Valid @RequestBody(required = true) LoginDto loginDto) { + TokenDto token = new TokenDto(); + token.setRaw("Generated Token"); + return ResponseEntity.ok(token); + } + + @Operation(operationId = "ping", responses = { + @ApiResponse(responseCode = "200", description = "Ping that needs an api_key attribute in the header", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = PingResponseDto.class), examples = { @ExampleObject(value = "{ pong: '2022-06-17T18:30:33.465+02:00' }") }) }), + @ApiResponse(responseCode = "401", description = "Unauthorized request", content = { @Content(mediaType = "application/json", schema = @Schema(implementation = ApplicationExceptionDto.class)) }), + @ApiResponse(responseCode = "403", description = "Forbidden request", content = { @Content(mediaType = "application/json", schema = @Schema(implementation = ApplicationExceptionDto.class)) }) }) + @RequestMapping(method = RequestMethod.GET, value = "/ping", produces = { "application/json" }) + public ResponseEntity ping(@RequestHeader(name = "api_key", required = false) String api_key) { + int year = 2000; + int month = 1; + int dayOfMonth = 1; + int hour = 0; + int minute = 0; + int second = 0; + int nanoSeccond = 0; + ZoneOffset offset = ZoneOffset.UTC; + PingResponseDto response = new PingResponseDto(); + response.setPong(OffsetDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoSeccond, offset)); + return ResponseEntity.ok(response); + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/dto/ApplicationExceptionDto.java b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/dto/ApplicationExceptionDto.java new file mode 100644 index 0000000000..5fb63793c4 --- /dev/null +++ b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/dto/ApplicationExceptionDto.java @@ -0,0 +1,26 @@ +package com.baeldung.defaultglobalsecurityscheme.dto; + +public class ApplicationExceptionDto { + private long errorCode; + private String description; + + public ApplicationExceptionDto() { + super(); + } + + public long getErrorCode() { + return errorCode; + } + + public void setErrorCode(long errorCode) { + this.errorCode = errorCode; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/dto/LoginDto.java b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/dto/LoginDto.java new file mode 100644 index 0000000000..cf88cc4d98 --- /dev/null +++ b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/dto/LoginDto.java @@ -0,0 +1,103 @@ +package com.baeldung.defaultglobalsecurityscheme.dto; + +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonTypeName; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * LoginDto + */ + +@JsonTypeName("Login") +public class LoginDto { + + @JsonProperty("user") + private String user; + + @JsonProperty("pass") + private String pass; + + public LoginDto user(String user) { + this.user = user; + return this; + } + + /** + * Get user + * @return user + */ + + @Schema(name = "user", required = true) + public String getUser() { + return user; + } + + public void setUser(String user) { + this.user = user; + } + + public LoginDto pass(String pass) { + this.pass = pass; + return this; + } + + /** + * Get pass + * @return pass + */ + + @Schema(name = "pass", required = true) + public String getPass() { + return pass; + } + + public void setPass(String pass) { + this.pass = pass; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + LoginDto login = (LoginDto) o; + return Objects.equals(this.user, login.user) && Objects.equals(this.pass, login.pass); + } + + @Override + public int hashCode() { + return Objects.hash(user, pass); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class LoginDto {\n"); + sb.append(" user: ") + .append(toIndentedString(user)) + .append("\n"); + sb.append(" pass: ") + .append(toIndentedString(pass)) + .append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString() + .replace("\n", "\n "); + } +} diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/dto/PingResponseDto.java b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/dto/PingResponseDto.java new file mode 100644 index 0000000000..0d367785d8 --- /dev/null +++ b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/dto/PingResponseDto.java @@ -0,0 +1,84 @@ +package com.baeldung.defaultglobalsecurityscheme.dto; + +import java.time.OffsetDateTime; +import java.util.Objects; + +import javax.validation.Valid; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonTypeName; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * SecuredPingResponseDto + */ + +@JsonTypeName("PingResponse") +public class PingResponseDto { + + @JsonProperty("pong") + @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) + private OffsetDateTime pong; + + public PingResponseDto pong(OffsetDateTime pong) { + this.pong = pong; + return this; + } + + /** + * Get pong + * @return pong + */ + @Valid + @Schema(name = "pong", required = false) + public OffsetDateTime getPong() { + return pong; + } + + public void setPong(OffsetDateTime pong) { + this.pong = pong; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + PingResponseDto securedPingResponse = (PingResponseDto) o; + return Objects.equals(this.pong, securedPingResponse.pong); + } + + @Override + public int hashCode() { + return Objects.hash(pong); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class PingResponseDto {\n"); + sb.append(" pong: ") + .append(toIndentedString(pong)) + .append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString() + .replace("\n", "\n "); + } +} diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/dto/TokenDto.java b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/dto/TokenDto.java new file mode 100644 index 0000000000..d8f7daa09c --- /dev/null +++ b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/dto/TokenDto.java @@ -0,0 +1,57 @@ +package com.baeldung.defaultglobalsecurityscheme.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonTypeName; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * LoginDto + */ + +@JsonTypeName("Token") +public class TokenDto { + + @JsonProperty("raw") + private String raw; + + @Schema(name = "raw", example = "app token") + public String getRaw() { + return raw; + } + + public void setRaw(String raw) { + this.raw = raw; + } + + @Override + public String toString() { + return "TokenDto [raw=" + raw + "]"; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((raw == null) ? 0 : raw.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + TokenDto other = (TokenDto) obj; + if (raw == null) { + if (other.raw != null) + return false; + } else if (!raw.equals(other.raw)) + return false; + return true; + } + +} diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/keycloaktestcontainers/IntegrationTest.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/keycloaktestcontainers/KeycloakTestContainers.java similarity index 95% rename from spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/keycloaktestcontainers/IntegrationTest.java rename to spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/keycloaktestcontainers/KeycloakTestContainers.java index 902c27b16e..44e24c98d1 100644 --- a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/keycloaktestcontainers/IntegrationTest.java +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/keycloaktestcontainers/KeycloakTestContainers.java @@ -26,11 +26,11 @@ import org.springframework.web.reactive.function.client.WebClient; import dasniko.testcontainers.keycloak.KeycloakContainer; import io.restassured.RestAssured; -@ContextConfiguration(initializers = { IntegrationTest.Initializer.class }) +@ContextConfiguration(initializers = { KeycloakTestContainers.Initializer.class }) @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) -public abstract class IntegrationTest { +public abstract class KeycloakTestContainers { - private static final Logger LOGGER = LoggerFactory.getLogger(IntegrationTest.class.getName()); + private static final Logger LOGGER = LoggerFactory.getLogger(KeycloakTestContainers.class.getName()); @LocalServerPort private int port; diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/keycloaktestcontainers/UserControllerIntegrationTest.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/keycloaktestcontainers/UserControllerManualTest.java similarity index 77% rename from spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/keycloaktestcontainers/UserControllerIntegrationTest.java rename to spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/keycloaktestcontainers/UserControllerManualTest.java index 4015612860..817c8ae130 100644 --- a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/keycloaktestcontainers/UserControllerIntegrationTest.java +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/keycloaktestcontainers/UserControllerManualTest.java @@ -5,7 +5,11 @@ import static org.hamcrest.Matchers.equalTo; import org.junit.jupiter.api.Test; -class UserControllerIntegrationTest extends IntegrationTest { +/** + * Requires Docker running on the machine to run without errors + * Therefore, skipped from pipeline + */ +class UserControllerManualTest extends KeycloakTestContainers { @Test void givenAuthenticatedUser_whenGetMe_shouldReturnMyInfo() { diff --git a/spring-cloud-modules/spring-cloud-archaius/pom.xml b/spring-cloud-modules/spring-cloud-archaius/pom.xml index 1208daaba6..66b7bb9b19 100644 --- a/spring-cloud-modules/spring-cloud-archaius/pom.xml +++ b/spring-cloud-modules/spring-cloud-archaius/pom.xml @@ -16,11 +16,11 @@ - basic-config additional-sources-simple + basic-config + dynamodb-config extra-configs jdbc-config - dynamodb-config zookeeper-config diff --git a/spring-cloud-modules/spring-cloud-eureka/pom.xml b/spring-cloud-modules/spring-cloud-eureka/pom.xml index 2a9c4f5fde..23523f2c2f 100644 --- a/spring-cloud-modules/spring-cloud-eureka/pom.xml +++ b/spring-cloud-modules/spring-cloud-eureka/pom.xml @@ -16,10 +16,11 @@ - spring-cloud-eureka-server spring-cloud-eureka-client + spring-cloud-eureka-client-profiles spring-cloud-eureka-feign-client spring-cloud-eureka-feign-client-integration-test + spring-cloud-eureka-server diff --git a/spring-cloud-modules/spring-cloud-hystrix/pom.xml b/spring-cloud-modules/spring-cloud-hystrix/pom.xml index e1f30c25dc..41548ba36a 100644 --- a/spring-cloud-modules/spring-cloud-hystrix/pom.xml +++ b/spring-cloud-modules/spring-cloud-hystrix/pom.xml @@ -15,9 +15,9 @@ + feign-rest-consumer rest-producer rest-consumer - feign-rest-consumer \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-netflix-sidecar/echo-demo/pom.xml b/spring-cloud-modules/spring-cloud-netflix-sidecar/echo-demo/pom.xml index 60b6eab020..d8b1654eaa 100644 --- a/spring-cloud-modules/spring-cloud-netflix-sidecar/echo-demo/pom.xml +++ b/spring-cloud-modules/spring-cloud-netflix-sidecar/echo-demo/pom.xml @@ -9,7 +9,6 @@ com.baeldung.cloud spring-cloud-netflix-sidecar 0.0.1-SNAPSHOT - ../pom.xml diff --git a/spring-cloud-modules/spring-cloud-netflix-sidecar/pom.xml b/spring-cloud-modules/spring-cloud-netflix-sidecar/pom.xml index 0d95714bf9..3a72496279 100644 --- a/spring-cloud-modules/spring-cloud-netflix-sidecar/pom.xml +++ b/spring-cloud-modules/spring-cloud-netflix-sidecar/pom.xml @@ -11,10 +11,9 @@ Netflix Sidecar project for Spring Boot - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../../parent-boot-2 + com.baeldung.spring.cloud + spring-cloud-modules + 1.0.0-SNAPSHOT diff --git a/spring-cloud-modules/spring-cloud-netflix-sidecar/sidecar-demo/pom.xml b/spring-cloud-modules/spring-cloud-netflix-sidecar/sidecar-demo/pom.xml index 3c8d498456..200897652f 100644 --- a/spring-cloud-modules/spring-cloud-netflix-sidecar/sidecar-demo/pom.xml +++ b/spring-cloud-modules/spring-cloud-netflix-sidecar/sidecar-demo/pom.xml @@ -11,7 +11,6 @@ com.baeldung.cloud spring-cloud-netflix-sidecar 0.0.1-SNAPSHOT - ../pom.xml diff --git a/spring-cloud-modules/spring-cloud-openfeign/pom.xml b/spring-cloud-modules/spring-cloud-openfeign/pom.xml index 480663eb1c..5657577cb0 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/pom.xml +++ b/spring-cloud-modules/spring-cloud-openfeign/pom.xml @@ -9,10 +9,9 @@ OpenFeign project for Spring Boot - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../../parent-boot-2 + com.baeldung.spring.cloud + spring-cloud-modules + 1.0.0-SNAPSHOT diff --git a/spring-cloud-modules/spring-cloud-zuul/pom.xml b/spring-cloud-modules/spring-cloud-zuul/pom.xml index e99cbdf355..b04a21da1c 100644 --- a/spring-cloud-modules/spring-cloud-zuul/pom.xml +++ b/spring-cloud-modules/spring-cloud-zuul/pom.xml @@ -17,9 +17,9 @@ spring-zuul-foos-resource - spring-zuul-ui - spring-zuul-rate-limiting spring-zuul-post-filter + spring-zuul-rate-limiting + spring-zuul-ui diff --git a/spring-jms/pom.xml b/spring-jms/pom.xml index 09bf854221..ab202402f3 100644 --- a/spring-jms/pom.xml +++ b/spring-jms/pom.xml @@ -41,6 +41,25 @@ ${spring-boot-test.version} test + + + org.mockito + mockito-core + 4.6.1 + test + + + org.apache.activemq.tooling + activemq-junit + 5.16.5 + test + + + org.testcontainers + testcontainers + 1.17.3 + test + diff --git a/spring-jms/src/main/java/com/baeldung/spring/jms/testing/JmsApplication.java b/spring-jms/src/main/java/com/baeldung/spring/jms/testing/JmsApplication.java new file mode 100644 index 0000000000..0a89d422b4 --- /dev/null +++ b/spring-jms/src/main/java/com/baeldung/spring/jms/testing/JmsApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.spring.jms.testing; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.ComponentScan; + +@ComponentScan +public class JmsApplication { + + public static void main(String[] args) { + ApplicationContext context = new AnnotationConfigApplicationContext(JmsApplication.class); + } +} diff --git a/spring-jms/src/main/java/com/baeldung/spring/jms/testing/JmsConfig.java b/spring-jms/src/main/java/com/baeldung/spring/jms/testing/JmsConfig.java new file mode 100644 index 0000000000..92abb32861 --- /dev/null +++ b/spring-jms/src/main/java/com/baeldung/spring/jms/testing/JmsConfig.java @@ -0,0 +1,34 @@ +package com.baeldung.spring.jms.testing; + +import javax.jms.ConnectionFactory; + +import org.apache.activemq.ActiveMQConnectionFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jms.annotation.EnableJms; +import org.springframework.jms.config.DefaultJmsListenerContainerFactory; +import org.springframework.jms.config.JmsListenerContainerFactory; +import org.springframework.jms.core.JmsTemplate; + +@Configuration +@EnableJms +public class JmsConfig { + + @Bean + public JmsListenerContainerFactory jmsListenerContainerFactory() { + DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); + factory.setConnectionFactory(connectionFactory()); + return factory; + } + + @Bean + public ConnectionFactory connectionFactory() { + return new ActiveMQConnectionFactory("tcp://localhost:61616"); + } + + @Bean + public JmsTemplate jmsTemplate() { + return new JmsTemplate(connectionFactory()); + } + +} diff --git a/spring-jms/src/main/java/com/baeldung/spring/jms/testing/MessageListener.java b/spring-jms/src/main/java/com/baeldung/spring/jms/testing/MessageListener.java new file mode 100644 index 0000000000..f66a99c876 --- /dev/null +++ b/spring-jms/src/main/java/com/baeldung/spring/jms/testing/MessageListener.java @@ -0,0 +1,20 @@ +package com.baeldung.spring.jms.testing; + +import javax.jms.JMSException; +import javax.jms.TextMessage; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jms.annotation.JmsListener; +import org.springframework.stereotype.Component; + +@Component +public class MessageListener { + + private static final Logger logger = LoggerFactory.getLogger(MessageListener.class); + + @JmsListener(destination = "queue-1") + public void sampleJmsListenerMethod(TextMessage message) throws JMSException { + logger.info("JMS listener received text message: {}", message.getText()); + } +} diff --git a/spring-jms/src/main/java/com/baeldung/spring/jms/testing/MessageSender.java b/spring-jms/src/main/java/com/baeldung/spring/jms/testing/MessageSender.java new file mode 100644 index 0000000000..6cb199b0e9 --- /dev/null +++ b/spring-jms/src/main/java/com/baeldung/spring/jms/testing/MessageSender.java @@ -0,0 +1,21 @@ +package com.baeldung.spring.jms.testing; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jms.core.JmsTemplate; +import org.springframework.stereotype.Component; + +@Component +public class MessageSender { + + @Autowired + private JmsTemplate jmsTemplate; + + private static final Logger logger = LoggerFactory.getLogger(MessageSender.class); + + public void sendTextMessage(String destination, String message) { + logger.info("Sending message to {} destination with text {}", destination, message); + jmsTemplate.send(destination, s -> s.createTextMessage(message)); + } +} diff --git a/spring-jms/src/test/java/com/baeldung/spring/jms/testing/EmbeddedActiveMqIntegrationTest.java b/spring-jms/src/test/java/com/baeldung/spring/jms/testing/EmbeddedActiveMqIntegrationTest.java new file mode 100644 index 0000000000..6644ee50ac --- /dev/null +++ b/spring-jms/src/test/java/com/baeldung/spring/jms/testing/EmbeddedActiveMqIntegrationTest.java @@ -0,0 +1,91 @@ +package com.baeldung.spring.jms.testing; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import javax.jms.ConnectionFactory; +import javax.jms.JMSException; +import javax.jms.TextMessage; + +import org.apache.activemq.ActiveMQConnectionFactory; +import org.apache.activemq.junit.EmbeddedActiveMQBroker; +import org.junit.ClassRule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Mockito; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jms.annotation.EnableJms; +import org.springframework.jms.config.DefaultJmsListenerContainerFactory; +import org.springframework.jms.config.JmsListenerContainerFactory; +import org.springframework.jms.core.JmsTemplate; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.spring.jms.testing.EmbeddedActiveMqIntegrationTest.TestConfiguration; + +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = { TestConfiguration.class }) +public class EmbeddedActiveMqIntegrationTest { + + @ClassRule + public static EmbeddedActiveMQBroker embeddedBroker = new EmbeddedActiveMQBroker(); + + @SpyBean + private MessageListener messageListener; + + @SpyBean + private MessageSender messageSender; + + @Test + public void whenListening_thenReceivingCorrectMessage() throws JMSException { + String queueName = "queue-1"; + String messageText = "Test message"; + + embeddedBroker.pushMessage(queueName, messageText); + assertEquals(1, embeddedBroker.getMessageCount(queueName)); + + ArgumentCaptor messageCaptor = ArgumentCaptor.forClass(TextMessage.class); + + Mockito.verify(messageListener, Mockito.timeout(100)) + .sampleJmsListenerMethod(messageCaptor.capture()); + + TextMessage receivedMessage = messageCaptor.getValue(); + assertEquals(messageText, receivedMessage.getText()); + } + + @Test + public void whenSendingMessage_thenCorrectQueueAndMessageText() throws JMSException { + String queueName = "queue-2"; + String messageText = "Test message"; + + messageSender.sendTextMessage(queueName, messageText); + + assertEquals(1, embeddedBroker.getMessageCount(queueName)); + TextMessage sentMessage = embeddedBroker.peekTextMessage(queueName); + assertEquals(messageText, sentMessage.getText()); + } + + @Configuration + @EnableJms + static class TestConfiguration { + @Bean + public JmsListenerContainerFactory jmsListenerContainerFactory() { + DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); + factory.setConnectionFactory(connectionFactory()); + return factory; + } + + @Bean + public ConnectionFactory connectionFactory() { + return new ActiveMQConnectionFactory(embeddedBroker.getVmURL()); + } + + @Bean + public JmsTemplate jmsTemplate() { + return new JmsTemplate(connectionFactory()); + } + } + +} diff --git a/spring-jms/src/test/java/com/baeldung/spring/jms/testing/TestContainersActiveMqIntegrationTest.java b/spring-jms/src/test/java/com/baeldung/spring/jms/testing/TestContainersActiveMqIntegrationTest.java new file mode 100644 index 0000000000..d117b90423 --- /dev/null +++ b/spring-jms/src/test/java/com/baeldung/spring/jms/testing/TestContainersActiveMqIntegrationTest.java @@ -0,0 +1,101 @@ +package com.baeldung.spring.jms.testing; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import javax.jms.ConnectionFactory; +import javax.jms.JMSException; +import javax.jms.Message; +import javax.jms.TextMessage; + +import org.apache.activemq.ActiveMQConnectionFactory; +import org.assertj.core.api.Assertions; +import org.junit.ClassRule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jms.annotation.EnableJms; +import org.springframework.jms.config.DefaultJmsListenerContainerFactory; +import org.springframework.jms.config.JmsListenerContainerFactory; +import org.springframework.jms.core.JmsTemplate; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; + +import com.baeldung.spring.jms.testing.TestContainersActiveMqIntegrationTest.TestConfiguration; + +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = { TestConfiguration.class, MessageSender.class }) +public class TestContainersActiveMqIntegrationTest { + + @ClassRule + public static GenericContainer activeMqContainer = new GenericContainer<>(DockerImageName.parse("rmohr/activemq:5.14.3")).withExposedPorts(61616); + + @SpyBean + private MessageListener messageListener; + + @Autowired + private MessageSender messageSender; + + @Autowired + private JmsTemplate jmsTemplate; + + @Test + public void whenListening_thenReceivingCorrectMessage() throws JMSException { + String queueName = "queue-1"; + String messageText = "Test message"; + + jmsTemplate.send(queueName, s -> s.createTextMessage(messageText)); + + ArgumentCaptor messageCaptor = ArgumentCaptor.forClass(TextMessage.class); + + Mockito.verify(messageListener, Mockito.timeout(100)) + .sampleJmsListenerMethod(messageCaptor.capture()); + + TextMessage receivedMessage = messageCaptor.getValue(); + assertEquals(messageText, receivedMessage.getText()); + } + + @Test + public void whenSendingMessage_thenCorrectQueueAndMessageText() throws JMSException { + String queueName = "queue-2"; + String messageText = "Test message"; + + messageSender.sendTextMessage(queueName, messageText); + + Message sentMessage = jmsTemplate.receive(queueName); + Assertions.assertThat(sentMessage) + .isInstanceOf(TextMessage.class); + + assertEquals(messageText, ((TextMessage) sentMessage).getText()); + } + + @Configuration + @EnableJms + static class TestConfiguration { + @Bean + public JmsListenerContainerFactory jmsListenerContainerFactory() { + DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); + factory.setConnectionFactory(connectionFactory()); + return factory; + } + + @Bean + public ConnectionFactory connectionFactory() { + String brokerUrlFormat = "tcp://%s:%d"; + String brokerUrl = String.format(brokerUrlFormat, activeMqContainer.getHost(), activeMqContainer.getFirstMappedPort()); + return new ActiveMQConnectionFactory(brokerUrl); + } + + @Bean + public JmsTemplate jmsTemplate() { + return new JmsTemplate(connectionFactory()); + } + } + +} diff --git a/spring-web-modules/spring-resttemplate-2/pom.xml b/spring-web-modules/spring-resttemplate-2/pom.xml index b87b245da9..0228b1dc4f 100644 --- a/spring-web-modules/spring-resttemplate-2/pom.xml +++ b/spring-web-modules/spring-resttemplate-2/pom.xml @@ -12,7 +12,7 @@ com.baeldung parent-boot-2 0.0.1-SNAPSHOT - ../../parent-boot-2/pom.xml + ../../parent-boot-2 diff --git a/testing-modules/mockito-2/.gitignore b/testing-modules/mockito-2/.gitignore deleted file mode 100644 index 7f300600e6..0000000000 --- a/testing-modules/mockito-2/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -*.class - -.settings -.project - -#folders# -/target -/src/main/webapp/WEB-INF/classes -*/META-INF/* - -# Packaged files # -*.jar -*.war -*.ear diff --git a/testing-modules/mockito-2/README.md b/testing-modules/mockito-2/README.md deleted file mode 100644 index 6fd71bf305..0000000000 --- a/testing-modules/mockito-2/README.md +++ /dev/null @@ -1,10 +0,0 @@ -### Relevant articles - -- [Mockito’s Java 8 Features](https://www.baeldung.com/mockito-2-java-8) -- [Lazy Verification with Mockito 2](https://www.baeldung.com/mockito-2-lazy-verification) -- [Mockito Strict Stubbing and The UnnecessaryStubbingException](https://www.baeldung.com/mockito-unnecessary-stubbing-exception) -- [Mockito and Fluent APIs](https://www.baeldung.com/mockito-fluent-apis) -- [Mocking the ObjectMapper readValue() Method](https://www.baeldung.com/mockito-mock-jackson-read-value) -- [Introduction to Mockito’s AdditionalAnswers](https://www.baeldung.com/mockito-additionalanswers) -- [Difference Between when() and doXxx() Methods in Mockito](https://www.baeldung.com/java-mockito-when-vs-do) -- [Overview of Mockito MockSettings](https://www.baeldung.com/mockito-mocksettings) diff --git a/testing-modules/mockito-2/pom.xml b/testing-modules/mockito-2/pom.xml deleted file mode 100644 index e5812222eb..0000000000 --- a/testing-modules/mockito-2/pom.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - 4.0.0 - mockito-2 - 0.0.1-SNAPSHOT - mockito-2 - jar - - - com.baeldung - testing-modules - 1.0.0-SNAPSHOT - - - - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - - - org.mockito - mockito-junit-jupiter - ${mockito.version} - test - - - - \ No newline at end of file diff --git a/testing-modules/mockito-simple/pom.xml b/testing-modules/mockito-simple/pom.xml index af0c63520a..6b056d09b5 100644 --- a/testing-modules/mockito-simple/pom.xml +++ b/testing-modules/mockito-simple/pom.xml @@ -29,35 +29,16 @@ spring-context ${spring-framework.version} - - org.springframework.data - spring-data-jpa - ${spring-data.version} - - - org.eclipse.persistence - javax.persistence - ${javax.persistence.version} - + org.apache.commons commons-lang3 ${commons-lang3.version} + - - org.springframework.boot - spring-boot-starter - ${spring-boot.version} - test - - - org.springframework.boot - spring-boot-starter-test - ${spring-boot.version} - test - + org.mockito mockito-junit-jupiter @@ -77,12 +58,10 @@ - 2.0.4.RELEASE - 5.0.8.RELEASE - 2.0.9.RELEASE + 2.6.4 + 5.3.20 - 2.0.2 - 2.1.1 + 4.6.1 diff --git a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockFinals.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockFinals.java deleted file mode 100644 index 6ff791ae06..0000000000 --- a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockFinals.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.baeldung.mockito; - -import org.junit.Test; - -import static org.junit.Assert.assertNotEquals; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -public class MockFinals { - - @Test - public void whenMockFinalClassMockWorks() { - - FinalList finalList = new FinalList(); - - FinalList mock = mock(FinalList.class); - when(mock.size()).thenReturn(2); - - assertNotEquals(mock.size(), finalList.size()); - - } - - @Test - public void whenMockFinalMethodMockWorks() { - - MyList myList = new MyList(); - - MyList mock = mock(MyList.class); - when(mock.finalMethod()).thenReturn(1); - - assertNotEquals(mock.finalMethod(), myList.finalMethod()); - } - - - } diff --git a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationUnitTest.java index 1d3d6b1428..bd68afac75 100644 --- a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationUnitTest.java +++ b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationUnitTest.java @@ -1,16 +1,22 @@ package com.baeldung.mockito; -import org.junit.Before; -import org.junit.Test; -import org.mockito.*; +import static org.junit.Assert.assertEquals; import java.util.ArrayList; import java.util.List; import java.util.Map; -import static org.junit.Assert.assertEquals; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.Spy; +import org.mockito.junit.MockitoJUnitRunner; -//@RunWith(MockitoJUnitRunner.class) +@RunWith(MockitoJUnitRunner.class) public class MockitoAnnotationUnitTest { @Mock @@ -19,11 +25,14 @@ public class MockitoAnnotationUnitTest { @Spy private List spiedList = new ArrayList<>(); + // Use either @RunWith(MockitoJUnitRunner.class) or manually openMocks in the @Before method + /* @Before public void init() { - MockitoAnnotations.initMocks(this); + MockitoAnnotations.openMocks(this); } - + */ + // tests @Test @@ -91,7 +100,7 @@ public class MockitoAnnotationUnitTest { ArgumentCaptor argCaptor; @Test - public void whenUseCaptorAnnotation_thenTheSam() { + public void whenUseCaptorAnnotation_thenTheSame() { mockedList.add("one"); Mockito.verify(mockedList).add(argCaptor.capture()); diff --git a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoInitWithMockitoJUnitRuleUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationsInitWithMockitoJUnitRuleUnitTest.java similarity index 90% rename from testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoInitWithMockitoJUnitRuleUnitTest.java rename to testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationsInitWithMockitoJUnitRuleUnitTest.java index 1bbe13ec84..88a9410101 100644 --- a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoInitWithMockitoJUnitRuleUnitTest.java +++ b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationsInitWithMockitoJUnitRuleUnitTest.java @@ -11,7 +11,7 @@ import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; -public class MockitoInitWithMockitoJUnitRuleUnitTest { +public class MockitoAnnotationsInitWithMockitoJUnitRuleUnitTest { @Rule public MockitoRule initRule = MockitoJUnit.rule(); diff --git a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationsInjectIntoSpyUnitTest.java similarity index 84% rename from testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java rename to testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationsInjectIntoSpyUnitTest.java index d6a11bbc7d..9d3a00f8b9 100644 --- a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java +++ b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationsInjectIntoSpyUnitTest.java @@ -5,18 +5,17 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.junit.MockitoJUnitRunner; import org.mockito.*; -import org.mockito.junit.MockitoJUnitRunner; import java.util.Map; import static org.junit.Assert.assertEquals; @RunWith(MockitoJUnitRunner.class) -public class MockitoInjectIntoSpyUnitTest { +public class MockitoAnnotationsInjectIntoSpyUnitTest { @Before public void init() { - MockitoAnnotations.initMocks(this); + MockitoAnnotations.openMocks(this); spyDic = Mockito.spy(new MyDictionary(wordMap)); } diff --git a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoMockIntegrationTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoMockIntegrationTest.java deleted file mode 100644 index 944d41316d..0000000000 --- a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoMockIntegrationTest.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.baeldung.mockito; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.mockito.MockSettings; -import org.mockito.exceptions.verification.TooFewActualInvocations; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; - -import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; -import static org.mockito.Mockito.*; - -public class MockitoMockIntegrationTest { - - private static class CustomAnswer implements Answer { - @Override - public Boolean answer(InvocationOnMock invocation) throws Throwable { - return false; - } - } - - @Rule - public ExpectedException thrown = ExpectedException.none(); - - @Test - public void whenUsingSimpleMock_thenCorrect() { - MyList listMock = mock(MyList.class); - when(listMock.add(anyString())).thenReturn(false); - boolean added = listMock.add(randomAlphabetic(6)); - - verify(listMock).add(anyString()); - assertThat(added, is(false)); - } - - @Test - public void whenUsingMockWithName_thenCorrect() { - MyList listMock = mock(MyList.class, "myMock"); - when(listMock.add(anyString())).thenReturn(false); - listMock.add(randomAlphabetic(6)); - - thrown.expect(TooFewActualInvocations.class); - thrown.expectMessage(containsString("myMock.add")); - - verify(listMock, times(2)).add(anyString()); - } - - @Test - public void whenUsingMockWithAnswer_thenCorrect() { - MyList listMock = mock(MyList.class, new CustomAnswer()); - boolean added = listMock.add(randomAlphabetic(6)); - - verify(listMock).add(anyString()); - assertThat(added, is(false)); - } - - @Test - public void whenUsingMockWithSettings_thenCorrect() { - MockSettings customSettings = withSettings().defaultAnswer(new CustomAnswer()); - MyList listMock = mock(MyList.class, customSettings); - boolean added = listMock.add(randomAlphabetic(6)); - - verify(listMock).add(anyString()); - assertThat(added, is(false)); - } -} \ No newline at end of file diff --git a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoMockUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoMockUnitTest.java index 27af3d8d1e..80f01338e6 100644 --- a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoMockUnitTest.java +++ b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoMockUnitTest.java @@ -1,15 +1,16 @@ package com.baeldung.mockito; -import static org.mockito.Mockito.*; - -import static org.junit.Assert.assertThat; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.containsString; import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.mockito.Mockito.withSettings; import org.junit.Test; -import org.junit.Rule; -import org.junit.rules.ExpectedException; import org.mockito.MockSettings; import org.mockito.exceptions.verification.TooFewActualInvocations; import org.mockito.invocation.InvocationOnMock; @@ -17,16 +18,6 @@ import org.mockito.stubbing.Answer; public class MockitoMockUnitTest { - private static class CustomAnswer implements Answer { - @Override - public Boolean answer(InvocationOnMock invocation) throws Throwable { - return false; - } - } - - @Rule - public ExpectedException thrown = ExpectedException.none(); - @Test public void whenUsingSimpleMock_thenCorrect() { MyList listMock = mock(MyList.class); @@ -34,7 +25,7 @@ public class MockitoMockUnitTest { boolean added = listMock.add(randomAlphabetic(6)); verify(listMock).add(anyString()); - assertThat(added, is(false)); + assertThat(added).isFalse(); } @Test @@ -43,19 +34,26 @@ public class MockitoMockUnitTest { when(listMock.add(anyString())).thenReturn(false); listMock.add(randomAlphabetic(6)); - thrown.expect(TooFewActualInvocations.class); - thrown.expectMessage(containsString("myMock.add")); - - verify(listMock, times(2)).add(anyString()); + Throwable exceptionThrown = assertThrows(TooFewActualInvocations.class, + () -> verify(listMock, times(2)).add(anyString())); + + assertThat(exceptionThrown.getMessage()).contains("myMock.add"); } + private static class CustomAnswer implements Answer { + @Override + public Boolean answer(InvocationOnMock invocation) throws Throwable { + return false; + } + } + @Test public void whenUsingMockWithAnswer_thenCorrect() { MyList listMock = mock(MyList.class, new CustomAnswer()); boolean added = listMock.add(randomAlphabetic(6)); verify(listMock).add(anyString()); - assertThat(added, is(false)); + assertThat(added).isFalse(); } @Test @@ -65,6 +63,6 @@ public class MockitoMockUnitTest { boolean added = listMock.add(randomAlphabetic(6)); verify(listMock).add(anyString()); - assertThat(added, is(false)); + assertThat(added).isFalse(); } } \ No newline at end of file diff --git a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoConfigExamplesUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoWhenThenExamplesUnitTest.java similarity index 84% rename from testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoConfigExamplesUnitTest.java rename to testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoWhenThenExamplesUnitTest.java index 6a5f797b41..d110fff00f 100644 --- a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoConfigExamplesUnitTest.java +++ b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoWhenThenExamplesUnitTest.java @@ -1,19 +1,18 @@ package com.baeldung.mockito; +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.when; + import org.junit.Test; import org.mockito.Mockito; -import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; -import static org.mockito.Mockito.*; - -import com.baeldung.mockito.MyList; - -public class MockitoConfigExamplesUnitTest { - - // tests +public class MockitoWhenThenExamplesUnitTest { @Test public final void whenMockReturnBehaviorIsConfigured_thenBehaviorIsVerified() { @@ -21,7 +20,7 @@ public class MockitoConfigExamplesUnitTest { when(listMock.add(anyString())).thenReturn(false); final boolean added = listMock.add(randomAlphabetic(6)); - assertThat(added, is(false)); + assertThat(added).isFalse(); } @Test @@ -30,7 +29,7 @@ public class MockitoConfigExamplesUnitTest { doReturn(false).when(listMock).add(anyString()); final boolean added = listMock.add(randomAlphabetic(6)); - assertThat(added, is(false)); + assertThat(added).isFalse(); } @Test(expected = IllegalStateException.class) @@ -41,14 +40,6 @@ public class MockitoConfigExamplesUnitTest { listMock.add(randomAlphabetic(6)); } - @Test(expected = NullPointerException.class) - public final void whenMethodHasNoReturnType_whenConfiguringBehaviorOfMethod_thenPossible() { - final MyList listMock = Mockito.mock(MyList.class); - doThrow(NullPointerException.class).when(listMock).clear(); - - listMock.clear(); - } - @Test public final void givenBehaviorIsConfiguredToThrowExceptionOnSecondCall_whenCallingOnlyOnce_thenNoExceptionIsThrown() { final MyList listMock = Mockito.mock(MyList.class); @@ -56,6 +47,14 @@ public class MockitoConfigExamplesUnitTest { listMock.add(randomAlphabetic(6)); } + + @Test(expected = NullPointerException.class) + public final void whenMethodHasNoReturnType_whenConfiguringBehaviorOfMethod_thenPossible() { + final MyList listMock = Mockito.mock(MyList.class); + doThrow(NullPointerException.class).when(listMock).clear(); + + listMock.clear(); + } @Test(expected = IllegalStateException.class) public final void givenBehaviorIsConfiguredToThrowExceptionOnSecondCall_whenCallingTwice_thenExceptionIsThrown() { @@ -66,23 +65,6 @@ public class MockitoConfigExamplesUnitTest { listMock.add(randomAlphabetic(6)); } - @Test - public final void whenMockMethodCallIsConfiguredToCallTheRealMethod_thenRealMethodIsCalled() { - final MyList listMock = Mockito.mock(MyList.class); - when(listMock.size()).thenCallRealMethod(); - - assertThat(listMock.size(), equalTo(1)); - } - - @Test - public final void whenMockMethodCallIsConfiguredWithCustomAnswer_thenRealMethodIsCalled() { - final MyList listMock = Mockito.mock(MyList.class); - doAnswer(invocation -> "Always the same").when(listMock).get(anyInt()); - - final String element = listMock.get(1); - assertThat(element, is(equalTo("Always the same"))); - } - @Test(expected = NullPointerException.class) public final void givenSpy_whenConfiguringBehaviorOfSpy_thenCorrectlyConfigured() { final MyList instance = new MyList(); @@ -91,5 +73,21 @@ public class MockitoConfigExamplesUnitTest { doThrow(NullPointerException.class).when(spy).size(); spy.size(); } + + @Test + public final void whenMockMethodCallIsConfiguredToCallTheRealMethod_thenRealMethodIsCalled() { + final MyList listMock = Mockito.mock(MyList.class); + when(listMock.size()).thenCallRealMethod(); + assertThat(listMock).hasSize(1); + } + + @Test + public final void whenMockMethodCallIsConfiguredWithCustomAnswer_thenRealMethodIsCalled() { + final MyList listMock = Mockito.mock(MyList.class); + doAnswer(invocation -> "Always the same").when(listMock).get(anyInt()); + + final String element = listMock.get(1); + assertThat(element).isEqualTo("Always the same"); + } } diff --git a/testing-modules/mockito/.gitignore b/testing-modules/mockito/.gitignore index 83c05e60c8..7f300600e6 100644 --- a/testing-modules/mockito/.gitignore +++ b/testing-modules/mockito/.gitignore @@ -1,13 +1,14 @@ *.class +.settings +.project + #folders# /target -/neoDb* -/data /src/main/webapp/WEB-INF/classes */META-INF/* # Packaged files # *.jar *.war -*.ear \ No newline at end of file +*.ear diff --git a/testing-modules/mockito/README.md b/testing-modules/mockito/README.md index 6cc6bb8955..2870d1afcf 100644 --- a/testing-modules/mockito/README.md +++ b/testing-modules/mockito/README.md @@ -1,8 +1,12 @@ -========= +### Relevant articles -## Mockito Cookbooks and Examples - - -### Relevant Articles: +- [Mockito’s Java 8 Features](https://www.baeldung.com/mockito-2-java-8) +- [Lazy Verification with Mockito 2](https://www.baeldung.com/mockito-2-lazy-verification) +- [Mockito Strict Stubbing and The UnnecessaryStubbingException](https://www.baeldung.com/mockito-unnecessary-stubbing-exception) +- [Mockito and Fluent APIs](https://www.baeldung.com/mockito-fluent-apis) +- [Mocking the ObjectMapper readValue() Method](https://www.baeldung.com/mockito-mock-jackson-read-value) +- [Introduction to Mockito’s AdditionalAnswers](https://www.baeldung.com/mockito-additionalanswers) +- [Difference Between when() and doXxx() Methods in Mockito](https://www.baeldung.com/java-mockito-when-vs-do) +- [Overview of Mockito MockSettings](https://www.baeldung.com/mockito-mocksettings) - [Testing Callbacks with Mockito](https://www.baeldung.com/mockito-callbacks) - [Quick Guide to BDDMockito](https://www.baeldung.com/bdd-mockito) diff --git a/testing-modules/mockito/pom.xml b/testing-modules/mockito/pom.xml index 36f4a56dff..b55245f20c 100644 --- a/testing-modules/mockito/pom.xml +++ b/testing-modules/mockito/pom.xml @@ -4,75 +4,28 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 mockito - 0.1-SNAPSHOT + 0.0.1-SNAPSHOT mockito + jar com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../../parent-java + testing-modules + 1.0.0-SNAPSHOT - org.springframework - spring-core - ${spring-framework.version} + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} - org.springframework - spring-context - ${spring-framework.version} - - - org.springframework.data - spring-data-jpa - ${spring-data.version} - - - org.eclipse.persistence - javax.persistence - ${javax.persistence.version} - - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - - org.springframework.boot - spring-boot-starter - ${spring-boot.version} - test - - - org.springframework.boot - spring-boot-starter-test - ${spring-boot.version} + org.mockito + mockito-junit-jupiter + ${mockito.version} test - - mockito - - - src/main/resources - true - - - - - - 2.0.4.RELEASE - 5.0.8.RELEASE - 2.0.9.RELEASE - - 2.0.2 - 2.1.1 - - \ No newline at end of file diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/Book.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/additionalanswers/Book.java similarity index 100% rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/Book.java rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/additionalanswers/Book.java diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookRepository.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/additionalanswers/BookRepository.java similarity index 100% rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookRepository.java rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/additionalanswers/BookRepository.java diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookService.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/additionalanswers/BookService.java similarity index 100% rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookService.java rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/additionalanswers/BookService.java diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/fluentapi/Pizza.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/fluentapi/Pizza.java similarity index 100% rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/fluentapi/Pizza.java rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/fluentapi/Pizza.java diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/fluentapi/PizzaService.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/fluentapi/PizzaService.java similarity index 100% rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/fluentapi/PizzaService.java rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/fluentapi/PizzaService.java diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/JobPosition.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/java8/JobPosition.java similarity index 100% rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/JobPosition.java rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/java8/JobPosition.java diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/JobService.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/java8/JobService.java similarity index 100% rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/JobService.java rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/java8/JobService.java diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/Person.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/java8/Person.java similarity index 100% rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/Person.java rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/java8/Person.java diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentService.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/java8/UnemploymentService.java similarity index 100% rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentService.java rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/java8/UnemploymentService.java diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentServiceImpl.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/java8/UnemploymentServiceImpl.java similarity index 100% rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentServiceImpl.java rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/java8/UnemploymentServiceImpl.java diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/mocksettings/AbstractCoffee.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/mocksettings/AbstractCoffee.java similarity index 100% rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/mocksettings/AbstractCoffee.java rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/mocksettings/AbstractCoffee.java diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/mocksettings/SimpleService.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/mocksettings/SimpleService.java similarity index 100% rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/mocksettings/SimpleService.java rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/mocksettings/SimpleService.java diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/mocksettings/SpecialInterface.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/mocksettings/SpecialInterface.java similarity index 100% rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/mocksettings/SpecialInterface.java rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/mocksettings/SpecialInterface.java diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/objectmapper/Flower.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/objectmapper/Flower.java similarity index 100% rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/objectmapper/Flower.java rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/objectmapper/Flower.java diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidator.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidator.java similarity index 100% rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidator.java rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidator.java diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/whenvsdomethods/Employee.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/whenvsdomethods/Employee.java similarity index 100% rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/whenvsdomethods/Employee.java rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/whenvsdomethods/Employee.java diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/whenvsdomethods/IAmOnHolidayException.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/whenvsdomethods/IAmOnHolidayException.java similarity index 100% rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/whenvsdomethods/IAmOnHolidayException.java rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/whenvsdomethods/IAmOnHolidayException.java diff --git a/testing-modules/mockito/src/main/resources/logback.xml b/testing-modules/mockito/src/main/resources/logback.xml index ec0dc2469a..7d900d8ea8 100644 --- a/testing-modules/mockito/src/main/resources/logback.xml +++ b/testing-modules/mockito/src/main/resources/logback.xml @@ -2,17 +2,11 @@ - web - %date [%thread] %-5level %logger{36} - %message%n + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/additionalanswers/BookServiceUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/additionalanswers/BookServiceUnitTest.java similarity index 100% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/additionalanswers/BookServiceUnitTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/additionalanswers/BookServiceUnitTest.java diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/BDDMockitoUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/bddmockito/BDDMockitoUnitTest.java similarity index 100% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/BDDMockitoUnitTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/bddmockito/BDDMockitoUnitTest.java diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookRepository.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookRepository.java similarity index 100% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookRepository.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookRepository.java diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookService.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookService.java similarity index 100% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookService.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookService.java diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/fluentapi/PizzaServiceUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/fluentapi/PizzaServiceUnitTest.java similarity index 100% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/fluentapi/PizzaServiceUnitTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/fluentapi/PizzaServiceUnitTest.java diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/fluentapi/PizzaUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/fluentapi/PizzaUnitTest.java similarity index 100% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/fluentapi/PizzaUnitTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/fluentapi/PizzaUnitTest.java diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithLambdaUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithLambdaUnitTest.java similarity index 100% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithLambdaUnitTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithLambdaUnitTest.java diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithoutLambdaUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithoutLambdaUnitTest.java similarity index 100% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithoutLambdaUnitTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithoutLambdaUnitTest.java diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithLambdaUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithLambdaUnitTest.java similarity index 100% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithLambdaUnitTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithLambdaUnitTest.java diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithoutLambdaUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithoutLambdaUnitTest.java similarity index 100% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithoutLambdaUnitTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithoutLambdaUnitTest.java diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/JobServiceUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/java8/JobServiceUnitTest.java similarity index 100% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/JobServiceUnitTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/java8/JobServiceUnitTest.java diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/UnemploymentServiceImplUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/java8/UnemploymentServiceImplUnitTest.java similarity index 100% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/UnemploymentServiceImplUnitTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/java8/UnemploymentServiceImplUnitTest.java diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/lazyverification/LazyVerificationUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/lazyverification/LazyVerificationUnitTest.java similarity index 100% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/lazyverification/LazyVerificationUnitTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/lazyverification/LazyVerificationUnitTest.java diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/misusing/ExpectedTestFailureRule.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/misusing/ExpectedTestFailureRule.java similarity index 100% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/misusing/ExpectedTestFailureRule.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/misusing/ExpectedTestFailureRule.java diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/misusing/MockitoUnecessaryStubUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/misusing/MockitoUnecessaryStubUnitTest.java similarity index 100% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/misusing/MockitoUnecessaryStubUnitTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/misusing/MockitoUnecessaryStubUnitTest.java diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/mocksettings/MockSettingsUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/mocksettings/MockSettingsUnitTest.java similarity index 100% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/mocksettings/MockSettingsUnitTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/mocksettings/MockSettingsUnitTest.java diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidatorUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidatorUnitTest.java similarity index 100% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidatorUnitTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidatorUnitTest.java diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/whenvsdomethods/WhenVsDoMethodsUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/whenvsdomethods/WhenVsDoMethodsUnitTest.java similarity index 100% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/whenvsdomethods/WhenVsDoMethodsUnitTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/whenvsdomethods/WhenVsDoMethodsUnitTest.java diff --git a/testing-modules/pom.xml b/testing-modules/pom.xml index f931cf6947..1601bfb804 100644 --- a/testing-modules/pom.xml +++ b/testing-modules/pom.xml @@ -29,7 +29,6 @@ junit5-annotations junit5-migration load-testing-comparison - mockito-2 mockito mockito-simple mocks