diff --git a/core-java-modules/core-java-nio-2/pom.xml b/core-java-modules/core-java-nio-2/pom.xml
index 0c7c079406..7c4583476d 100644
--- a/core-java-modules/core-java-nio-2/pom.xml
+++ b/core-java-modules/core-java-nio-2/pom.xml
@@ -14,5 +14,12 @@
0.0.1-SNAPSHOT
../
-
+
+
+ org.assertj
+ assertj-core
+ 3.6.1
+ test
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/selector/SelectorManualTest.java b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/selector/SelectorManualTest.java
new file mode 100644
index 0000000000..7a6c9e6eab
--- /dev/null
+++ b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/selector/SelectorManualTest.java
@@ -0,0 +1,64 @@
+package com.baeldung.selector;
+
+import org.junit.Test;
+import java.io.IOException;
+import java.nio.channels.Pipe;
+import java.nio.channels.SelectableChannel;
+import java.nio.channels.Selector;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import static java.nio.channels.SelectionKey.OP_READ;
+
+public class SelectorManualTest {
+
+ @Test
+ public void whenWakeUpCalledOnSelector_thenBlockedThreadReturns() throws IOException, InterruptedException {
+ Pipe pipe = Pipe.open();
+
+ Selector selector = Selector.open();
+ SelectableChannel channel = pipe.source();
+ channel.configureBlocking(false);
+ channel.register(selector, OP_READ);
+
+ List invocationStepsTracker = Collections.synchronizedList(new ArrayList<>());
+
+ CountDownLatch latch = new CountDownLatch(1);
+
+ Thread thread = new Thread(() -> {
+ invocationStepsTracker.add(">> Count down");
+ latch.countDown();
+ try {
+ invocationStepsTracker.add(">> Start select");
+ selector.select();
+ invocationStepsTracker.add(">> End select");
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ });
+
+ invocationStepsTracker.add(">> Start await");
+ thread.start();
+ latch.await();
+ invocationStepsTracker.add(">> End await");
+
+ invocationStepsTracker.add(">> Wakeup thread");
+
+ selector.wakeup();
+ channel.close();
+
+ assertThat(invocationStepsTracker)
+ .containsExactly(
+ ">> Start await",
+ ">> Count down",
+ ">> Start select",
+ ">> End await",
+ ">> Wakeup thread",
+ ">> End select"
+ );
+ }
+}