BAEL 5932 - Callback Functions in Java (#13335)
This commit is contained in:
parent
b5d8f4e93c
commit
d7e857f427
|
@ -14,4 +14,30 @@
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mockito</groupId>
|
||||||
|
<artifactId>mockito-inline</artifactId>
|
||||||
|
<version>${mockito-inline.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<finalName>core-java-functional</finalName>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<directory>src/main/resources</directory>
|
||||||
|
<filtering>true</filtering>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<mockito-inline.version>3.8.0</mockito-inline.version>
|
||||||
|
<assertj.version>3.22.0</assertj.version>
|
||||||
|
<commons-lang3.version>3.12.0</commons-lang3.version>
|
||||||
|
<vavr.version>0.10.4</vavr.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
|
@ -0,0 +1,17 @@
|
||||||
|
package com.baeldung.callbackfunctions;
|
||||||
|
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
public class ConsumerCallback {
|
||||||
|
public void getAge(int initialAge, Consumer<Integer> callback) {
|
||||||
|
callback.accept(initialAge);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void increaseAge(int initialAge, int ageDifference, Consumer<Integer> callback) {
|
||||||
|
System.out.println("===== Increase age ====");
|
||||||
|
|
||||||
|
int newAge = initialAge + ageDifference;
|
||||||
|
callback.accept(newAge);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package com.baeldung.callbackfunctions;
|
||||||
|
|
||||||
|
public interface EventListener {
|
||||||
|
|
||||||
|
String onTrigger();
|
||||||
|
|
||||||
|
void respondToTrigger();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
package com.baeldung.callbackfunctions.asynchronous;
|
||||||
|
|
||||||
|
import com.baeldung.callbackfunctions.EventListener;
|
||||||
|
|
||||||
|
public class AsynchronousEventConsumer{
|
||||||
|
|
||||||
|
private EventListener listener;
|
||||||
|
|
||||||
|
public AsynchronousEventConsumer(EventListener listener) {
|
||||||
|
this.listener = listener;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void doAsynchronousOperation()
|
||||||
|
{
|
||||||
|
System.out.println("Performing operation in Asynchronous Task");
|
||||||
|
|
||||||
|
new Thread(() -> listener.onTrigger()).start();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
package com.baeldung.callbackfunctions.asynchronous;
|
||||||
|
|
||||||
|
import com.baeldung.callbackfunctions.EventListener;
|
||||||
|
|
||||||
|
public class AsynchronousEventListenerImpl implements EventListener {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String onTrigger()
|
||||||
|
{
|
||||||
|
respondToTrigger();
|
||||||
|
return "Asynchronously running callback function";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void respondToTrigger(){
|
||||||
|
System.out.println("This is a side effect of the asynchronous trigger.");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
package com.baeldung.callbackfunctions.synchronous;
|
||||||
|
|
||||||
|
import com.baeldung.callbackfunctions.EventListener;
|
||||||
|
|
||||||
|
public class SynchronousEventConsumer {
|
||||||
|
|
||||||
|
private final EventListener eventListener;
|
||||||
|
|
||||||
|
public SynchronousEventConsumer(EventListener listener)
|
||||||
|
{
|
||||||
|
this.eventListener = listener;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String doSynchronousOperation()
|
||||||
|
{
|
||||||
|
System.out.println("Performing callback before synchronous Task");
|
||||||
|
|
||||||
|
return eventListener.onTrigger();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
package com.baeldung.callbackfunctions.synchronous;
|
||||||
|
|
||||||
|
import com.baeldung.callbackfunctions.EventListener;
|
||||||
|
|
||||||
|
public class SynchronousEventListenerImpl implements EventListener {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String onTrigger()
|
||||||
|
{
|
||||||
|
return "Synchronously running callback function";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void respondToTrigger(){
|
||||||
|
System.out.println("Response to trigger");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
package com.baeldung.callbackfunctions;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.mockito.Mockito;
|
||||||
|
import com.baeldung.callbackfunctions.EventListener;
|
||||||
|
import com.baeldung.callbackfunctions.asynchronous.AsynchronousEventConsumer;
|
||||||
|
import com.baeldung.callbackfunctions.asynchronous.AsynchronousEventListenerImpl;
|
||||||
|
|
||||||
|
import static org.mockito.Mockito.times;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
|
||||||
|
public class AsynchronousCallbackUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenCallbackIsInvokedAsynchronously_shouldRunAsynchronousOperation(){
|
||||||
|
EventListener listener = Mockito.mock(AsynchronousEventListenerImpl.class);
|
||||||
|
AsynchronousEventConsumer asynchronousEventListenerConsumer = new AsynchronousEventConsumer(listener);
|
||||||
|
asynchronousEventListenerConsumer.doAsynchronousOperation();
|
||||||
|
|
||||||
|
verify(listener, times(1)).onTrigger();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
package com.baeldung.callbackfunctions;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import com.baeldung.callbackfunctions.ConsumerCallback;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
public class ConsumerCallbackUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenIncreasingInitialAgeByGivenValueThroughCallback_shouldIncreaseAge(){
|
||||||
|
ConsumerCallback consumerCallback = new ConsumerCallback();
|
||||||
|
consumerCallback.getAge(20, (initialAge) -> {
|
||||||
|
int ageDifference = 10;
|
||||||
|
consumerCallback.increaseAge(initialAge, ageDifference, (newAge) -> {
|
||||||
|
assertEquals(initialAge + ageDifference, newAge);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
package callbackFunctions;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import com.baeldung.callbackfunctions.EventListener;
|
||||||
|
import com.baeldung.callbackfunctions.synchronous.SynchronousEventConsumer;
|
||||||
|
import com.baeldung.callbackfunctions.synchronous.SynchronousEventListenerImpl;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
|
|
||||||
|
public class SynchronousCallbackUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenCallbackIsInvokedSynchronously_shouldRunSynchronousOperation(){
|
||||||
|
EventListener listener = new SynchronousEventListenerImpl();
|
||||||
|
SynchronousEventConsumer synchronousEventConsumer = new SynchronousEventConsumer(listener);
|
||||||
|
String result = synchronousEventConsumer.doSynchronousOperation();
|
||||||
|
|
||||||
|
assertNotNull(result);
|
||||||
|
assertEquals("Synchronously running callback function", result);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue