Skip to content

Commit 62c3d6b

Browse files
committed
Moved to core-java-function module
Added concurrent tests
1 parent 2ed7846 commit 62c3d6b

File tree

8 files changed

+110
-65
lines changed

8 files changed

+110
-65
lines changed

core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java

Lines changed: 0 additions & 26 deletions
This file was deleted.

core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java

Lines changed: 0 additions & 26 deletions
This file was deleted.

core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java renamed to core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
public class LambdaSupplier<T> {
66

7-
private final Supplier<T> expensiveData;
7+
protected final Supplier<T> expensiveData;
88

99
public LambdaSupplier(Supplier<T> expensiveData) {
1010
this.expensiveData = expensiveData;

core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java renamed to core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,15 @@
22

33
import java.util.function.Supplier;
44

5-
public class LazyLambdaSupplier<T> {
6-
7-
private final Supplier<T> expensiveData;
5+
public class LazyLambdaSupplier<T> extends LambdaSupplier<T> {
86

97
private T data;
108

119
public LazyLambdaSupplier(Supplier<T> expensiveData) {
12-
this.expensiveData = expensiveData;
10+
super(expensiveData);
1311
}
1412

13+
@Override
1514
public T getData() {
1615
if (data != null) {
1716
return data;

core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java renamed to core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,12 @@
33
import java.util.concurrent.atomic.AtomicReference;
44
import java.util.function.Supplier;
55

6-
public class LazyLambdaThreadSafeSupplier<T> {
7-
8-
private final Supplier<T> expensiveData;
6+
public class LazyLambdaThreadSafeSupplier<T> extends LambdaSupplier<T> {
97

108
private final AtomicReference<T> data;
119

1210
public LazyLambdaThreadSafeSupplier(Supplier<T> expensiveData) {
13-
this.expensiveData = expensiveData;
11+
super(expensiveData);
1412
data = new AtomicReference<>();
1513
}
1614

@@ -22,7 +20,6 @@ public T getData() {
2220
}
2321
}
2422
}
25-
2623
return data.get();
2724
}
2825

core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java renamed to core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@ public void whenCalledMultipleTimes_thenShouldBeCalledMultipleTimes() {
1717
.get();
1818
testee.getData();
1919
testee.getData();
20-
testee.getData();
21-
testee.getData();
22-
Mockito.verify(mockedExpensiveFunction, Mockito.times(4))
20+
Mockito.verify(mockedExpensiveFunction, Mockito.times(2))
2321
.get();
2422
}
2523

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.baeldung.lazylambda;
2+
3+
import java.util.List;
4+
import java.util.concurrent.ExecutorService;
5+
import java.util.concurrent.Executors;
6+
import java.util.concurrent.TimeUnit;
7+
import java.util.function.Supplier;
8+
9+
import org.junit.Test;
10+
import org.mockito.Mockito;
11+
import org.mockito.stubbing.Answer;
12+
13+
public class LazyLambdaSupplierUnitTest {
14+
15+
@Test
16+
public void whenCalledMultipleTimes_thenShouldBeCalledOnlyOnce() {
17+
@SuppressWarnings("unchecked") Supplier<String> mockedExpensiveFunction = Mockito.mock(Supplier.class);
18+
Mockito.when(mockedExpensiveFunction.get())
19+
.thenReturn("expensive call");
20+
LazyLambdaSupplier<String> testee = new LazyLambdaSupplier<>(mockedExpensiveFunction);
21+
Mockito.verify(mockedExpensiveFunction, Mockito.never())
22+
.get();
23+
testee.getData();
24+
testee.getData();
25+
Mockito.verify(mockedExpensiveFunction, Mockito.times(1))
26+
.get();
27+
}
28+
29+
@Test
30+
public void whenCalledMultipleTimesConcurrently_thenShouldBeCalledMultipleTimes() throws InterruptedException {
31+
@SuppressWarnings("unchecked") Supplier<String> mockedExpensiveFunction = Mockito.mock(Supplier.class);
32+
Mockito.when(mockedExpensiveFunction.get())
33+
.thenAnswer((Answer<String>) invocation -> {
34+
Thread.sleep(1000L);
35+
return "Late response!";
36+
});
37+
LazyLambdaSupplier<String> testee = new LazyLambdaSupplier<>(mockedExpensiveFunction);
38+
Mockito.verify(mockedExpensiveFunction, Mockito.never())
39+
.get();
40+
41+
ExecutorService executorService = Executors.newFixedThreadPool(4);
42+
executorService.invokeAll(List.of(testee::getData, testee::getData));
43+
executorService.shutdown();
44+
if (!executorService.awaitTermination(5, TimeUnit.SECONDS)) {
45+
executorService.shutdownNow();
46+
}
47+
48+
Mockito.verify(mockedExpensiveFunction, Mockito.times(2))
49+
.get();
50+
}
51+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.baeldung.lazylambda;
2+
3+
import java.util.List;
4+
import java.util.concurrent.ExecutorService;
5+
import java.util.concurrent.Executors;
6+
import java.util.concurrent.TimeUnit;
7+
import java.util.function.Supplier;
8+
9+
import org.junit.Test;
10+
import org.mockito.Mockito;
11+
import org.mockito.stubbing.Answer;
12+
13+
public class LazyLambdaThreadSafeSupplierUnitTest {
14+
15+
@Test
16+
public void whenCalledMultipleTimes_thenShouldBeCalledOnlyOnce() {
17+
@SuppressWarnings("unchecked") Supplier<String> mockedExpensiveFunction = Mockito.mock(Supplier.class);
18+
Mockito.when(mockedExpensiveFunction.get())
19+
.thenReturn("expensive call");
20+
LazyLambdaThreadSafeSupplier<String> testee = new LazyLambdaThreadSafeSupplier<>(mockedExpensiveFunction);
21+
Mockito.verify(mockedExpensiveFunction, Mockito.never())
22+
.get();
23+
testee.getData();
24+
testee.getData();
25+
Mockito.verify(mockedExpensiveFunction, Mockito.times(1))
26+
.get();
27+
}
28+
29+
@Test
30+
public void whenCalledMultipleTimesConcurrently_thenShouldBeCalledOnlyOnce() throws InterruptedException {
31+
@SuppressWarnings("unchecked") Supplier<String> mockedExpensiveFunction = Mockito.mock(Supplier.class);
32+
Mockito.when(mockedExpensiveFunction.get())
33+
.thenAnswer((Answer<String>) invocation -> {
34+
Thread.sleep(1000L);
35+
return "Late response!";
36+
});
37+
LazyLambdaThreadSafeSupplier<String> testee = new LazyLambdaThreadSafeSupplier<>(mockedExpensiveFunction);
38+
Mockito.verify(mockedExpensiveFunction, Mockito.never())
39+
.get();
40+
41+
ExecutorService executorService = Executors.newFixedThreadPool(4);
42+
executorService.invokeAll(List.of(testee::getData, testee::getData));
43+
executorService.shutdown();
44+
if (!executorService.awaitTermination(5, TimeUnit.SECONDS)) {
45+
executorService.shutdownNow();
46+
}
47+
48+
Mockito.verify(mockedExpensiveFunction, Mockito.times(1))
49+
.get();
50+
}
51+
52+
}

0 commit comments

Comments
 (0)