Moved to core-java-function module
Added concurrent tests
This commit is contained in:
parent
2ed78462c8
commit
62c3d6bf32
@ -1,26 +0,0 @@
|
|||||||
package com.baeldung.lazylambda;
|
|
||||||
|
|
||||||
import java.util.function.Supplier;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.mockito.Mockito;
|
|
||||||
|
|
||||||
public class LazyLambdaSupplierUnitTest {
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenCalledMultipleTimes_thenShouldBeCalledOnlyOnce() {
|
|
||||||
@SuppressWarnings("unchecked") Supplier<String> mockedExpensiveFunction = Mockito.mock(Supplier.class);
|
|
||||||
Mockito.when(mockedExpensiveFunction.get())
|
|
||||||
.thenReturn("expensive call");
|
|
||||||
LazyLambdaSupplier<String> testee = new LazyLambdaSupplier<>(mockedExpensiveFunction);
|
|
||||||
Mockito.verify(mockedExpensiveFunction, Mockito.never())
|
|
||||||
.get();
|
|
||||||
testee.getData();
|
|
||||||
testee.getData();
|
|
||||||
testee.getData();
|
|
||||||
testee.getData();
|
|
||||||
Mockito.verify(mockedExpensiveFunction, Mockito.times(1))
|
|
||||||
.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,26 +0,0 @@
|
|||||||
package com.baeldung.lazylambda;
|
|
||||||
|
|
||||||
import java.util.function.Supplier;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.mockito.Mockito;
|
|
||||||
|
|
||||||
public class LazyLambdaThreadSafeSupplierUnitTest {
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenCalledMultipleTimes_thenShouldBeCalledOnlyOnce() {
|
|
||||||
@SuppressWarnings("unchecked") Supplier<String> mockedExpensiveFunction = Mockito.mock(Supplier.class);
|
|
||||||
Mockito.when(mockedExpensiveFunction.get())
|
|
||||||
.thenReturn("expensive call");
|
|
||||||
LazyLambdaThreadSafeSupplier<String> testee = new LazyLambdaThreadSafeSupplier<>(mockedExpensiveFunction);
|
|
||||||
Mockito.verify(mockedExpensiveFunction, Mockito.never())
|
|
||||||
.get();
|
|
||||||
testee.getData();
|
|
||||||
testee.getData();
|
|
||||||
testee.getData();
|
|
||||||
testee.getData();
|
|
||||||
Mockito.verify(mockedExpensiveFunction, Mockito.times(1))
|
|
||||||
.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -4,7 +4,7 @@ import java.util.function.Supplier;
|
|||||||
|
|
||||||
public class LambdaSupplier<T> {
|
public class LambdaSupplier<T> {
|
||||||
|
|
||||||
private final Supplier<T> expensiveData;
|
protected final Supplier<T> expensiveData;
|
||||||
|
|
||||||
public LambdaSupplier(Supplier<T> expensiveData) {
|
public LambdaSupplier(Supplier<T> expensiveData) {
|
||||||
this.expensiveData = expensiveData;
|
this.expensiveData = expensiveData;
|
@ -2,16 +2,15 @@ package com.baeldung.lazylambda;
|
|||||||
|
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
public class LazyLambdaSupplier<T> {
|
public class LazyLambdaSupplier<T> extends LambdaSupplier<T> {
|
||||||
|
|
||||||
private final Supplier<T> expensiveData;
|
|
||||||
|
|
||||||
private T data;
|
private T data;
|
||||||
|
|
||||||
public LazyLambdaSupplier(Supplier<T> expensiveData) {
|
public LazyLambdaSupplier(Supplier<T> expensiveData) {
|
||||||
this.expensiveData = expensiveData;
|
super(expensiveData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public T getData() {
|
public T getData() {
|
||||||
if (data != null) {
|
if (data != null) {
|
||||||
return data;
|
return data;
|
@ -3,14 +3,12 @@ package com.baeldung.lazylambda;
|
|||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
public class LazyLambdaThreadSafeSupplier<T> {
|
public class LazyLambdaThreadSafeSupplier<T> extends LambdaSupplier<T> {
|
||||||
|
|
||||||
private final Supplier<T> expensiveData;
|
|
||||||
|
|
||||||
private final AtomicReference<T> data;
|
private final AtomicReference<T> data;
|
||||||
|
|
||||||
public LazyLambdaThreadSafeSupplier(Supplier<T> expensiveData) {
|
public LazyLambdaThreadSafeSupplier(Supplier<T> expensiveData) {
|
||||||
this.expensiveData = expensiveData;
|
super(expensiveData);
|
||||||
data = new AtomicReference<>();
|
data = new AtomicReference<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -22,7 +20,6 @@ public class LazyLambdaThreadSafeSupplier<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return data.get();
|
return data.get();
|
||||||
}
|
}
|
||||||
|
|
@ -17,9 +17,7 @@ public class LambdaSupplierUnitTest {
|
|||||||
.get();
|
.get();
|
||||||
testee.getData();
|
testee.getData();
|
||||||
testee.getData();
|
testee.getData();
|
||||||
testee.getData();
|
Mockito.verify(mockedExpensiveFunction, Mockito.times(2))
|
||||||
testee.getData();
|
|
||||||
Mockito.verify(mockedExpensiveFunction, Mockito.times(4))
|
|
||||||
.get();
|
.get();
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,51 @@
|
|||||||
|
package com.baeldung.lazylambda;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.mockito.Mockito;
|
||||||
|
import org.mockito.stubbing.Answer;
|
||||||
|
|
||||||
|
public class LazyLambdaSupplierUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenCalledMultipleTimes_thenShouldBeCalledOnlyOnce() {
|
||||||
|
@SuppressWarnings("unchecked") Supplier<String> mockedExpensiveFunction = Mockito.mock(Supplier.class);
|
||||||
|
Mockito.when(mockedExpensiveFunction.get())
|
||||||
|
.thenReturn("expensive call");
|
||||||
|
LazyLambdaSupplier<String> testee = new LazyLambdaSupplier<>(mockedExpensiveFunction);
|
||||||
|
Mockito.verify(mockedExpensiveFunction, Mockito.never())
|
||||||
|
.get();
|
||||||
|
testee.getData();
|
||||||
|
testee.getData();
|
||||||
|
Mockito.verify(mockedExpensiveFunction, Mockito.times(1))
|
||||||
|
.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenCalledMultipleTimesConcurrently_thenShouldBeCalledMultipleTimes() throws InterruptedException {
|
||||||
|
@SuppressWarnings("unchecked") Supplier<String> mockedExpensiveFunction = Mockito.mock(Supplier.class);
|
||||||
|
Mockito.when(mockedExpensiveFunction.get())
|
||||||
|
.thenAnswer((Answer<String>) invocation -> {
|
||||||
|
Thread.sleep(1000L);
|
||||||
|
return "Late response!";
|
||||||
|
});
|
||||||
|
LazyLambdaSupplier<String> testee = new LazyLambdaSupplier<>(mockedExpensiveFunction);
|
||||||
|
Mockito.verify(mockedExpensiveFunction, Mockito.never())
|
||||||
|
.get();
|
||||||
|
|
||||||
|
ExecutorService executorService = Executors.newFixedThreadPool(4);
|
||||||
|
executorService.invokeAll(List.of(testee::getData, testee::getData));
|
||||||
|
executorService.shutdown();
|
||||||
|
if (!executorService.awaitTermination(5, TimeUnit.SECONDS)) {
|
||||||
|
executorService.shutdownNow();
|
||||||
|
}
|
||||||
|
|
||||||
|
Mockito.verify(mockedExpensiveFunction, Mockito.times(2))
|
||||||
|
.get();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,52 @@
|
|||||||
|
package com.baeldung.lazylambda;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.mockito.Mockito;
|
||||||
|
import org.mockito.stubbing.Answer;
|
||||||
|
|
||||||
|
public class LazyLambdaThreadSafeSupplierUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenCalledMultipleTimes_thenShouldBeCalledOnlyOnce() {
|
||||||
|
@SuppressWarnings("unchecked") Supplier<String> mockedExpensiveFunction = Mockito.mock(Supplier.class);
|
||||||
|
Mockito.when(mockedExpensiveFunction.get())
|
||||||
|
.thenReturn("expensive call");
|
||||||
|
LazyLambdaThreadSafeSupplier<String> testee = new LazyLambdaThreadSafeSupplier<>(mockedExpensiveFunction);
|
||||||
|
Mockito.verify(mockedExpensiveFunction, Mockito.never())
|
||||||
|
.get();
|
||||||
|
testee.getData();
|
||||||
|
testee.getData();
|
||||||
|
Mockito.verify(mockedExpensiveFunction, Mockito.times(1))
|
||||||
|
.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenCalledMultipleTimesConcurrently_thenShouldBeCalledOnlyOnce() throws InterruptedException {
|
||||||
|
@SuppressWarnings("unchecked") Supplier<String> mockedExpensiveFunction = Mockito.mock(Supplier.class);
|
||||||
|
Mockito.when(mockedExpensiveFunction.get())
|
||||||
|
.thenAnswer((Answer<String>) invocation -> {
|
||||||
|
Thread.sleep(1000L);
|
||||||
|
return "Late response!";
|
||||||
|
});
|
||||||
|
LazyLambdaThreadSafeSupplier<String> testee = new LazyLambdaThreadSafeSupplier<>(mockedExpensiveFunction);
|
||||||
|
Mockito.verify(mockedExpensiveFunction, Mockito.never())
|
||||||
|
.get();
|
||||||
|
|
||||||
|
ExecutorService executorService = Executors.newFixedThreadPool(4);
|
||||||
|
executorService.invokeAll(List.of(testee::getData, testee::getData));
|
||||||
|
executorService.shutdown();
|
||||||
|
if (!executorService.awaitTermination(5, TimeUnit.SECONDS)) {
|
||||||
|
executorService.shutdownNow();
|
||||||
|
}
|
||||||
|
|
||||||
|
Mockito.verify(mockedExpensiveFunction, Mockito.times(1))
|
||||||
|
.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user