diff --git a/pom.xml b/pom.xml
index af2bf25232..0af0a32787 100644
--- a/pom.xml
+++ b/pom.xml
@@ -546,6 +546,7 @@
**/*CommandFlags*.java
**/*CompareCondition*.java
**/*MSetExParams*.java
+ **/*UnitTest.java
diff --git a/src/main/java/redis/clients/jedis/JedisPool.java b/src/main/java/redis/clients/jedis/JedisPool.java
index 3cc9aad107..411247da69 100644
--- a/src/main/java/redis/clients/jedis/JedisPool.java
+++ b/src/main/java/redis/clients/jedis/JedisPool.java
@@ -1,6 +1,8 @@
package redis.clients.jedis;
import java.net.URI;
+import java.util.function.Consumer;
+import java.util.function.Function;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLParameters;
import javax.net.ssl.SSLSocketFactory;
@@ -392,4 +394,17 @@ public void returnResource(final Jedis resource) {
}
}
}
+
+ public void withResource(Consumer consumer) {
+ try (Jedis jedis = this.getResource()) {
+ consumer.accept(jedis);
+ }
+ }
+
+ public K withResourceGet(Function function) {
+ try (Jedis jedis = this.getResource()) {
+ return function.apply(jedis);
+ }
+ }
+
}
diff --git a/src/test/java/redis/clients/jedis/JedisPoolTest.java b/src/test/java/redis/clients/jedis/JedisPoolTest.java
index 29209eee59..77be4005e9 100644
--- a/src/test/java/redis/clients/jedis/JedisPoolTest.java
+++ b/src/test/java/redis/clients/jedis/JedisPoolTest.java
@@ -9,8 +9,10 @@
import org.apache.commons.pool2.impl.DefaultPooledObject;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
+import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInfo;
import redis.clients.jedis.exceptions.InvalidURIException;
import redis.clients.jedis.exceptions.JedisAccessControlException;
import redis.clients.jedis.exceptions.JedisConnectionException;
@@ -18,6 +20,8 @@
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static org.awaitility.Awaitility.await;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.equalTo;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
import static org.junit.jupiter.api.Assertions.assertNull;
@@ -33,6 +37,15 @@ public class JedisPoolTest {
private static final EndpointConfig endpointStandalone1 = HostAndPorts.getRedisEndpoint("standalone1");
+ private String testKey;
+ private String testValue;
+
+ @BeforeEach
+ public void setUpTestKey(TestInfo testInfo) {
+ testKey = testInfo.getDisplayName() + "-key";
+ testValue = testInfo.getDisplayName() + "-value";
+ }
+
@Test
public void checkConnections() {
JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), endpointStandalone0.getPort(), 2000);
@@ -462,4 +475,64 @@ public void testResetValidCredentials() {
}
}
}
+
+ @Test
+ public void testWithResource() {
+ try (JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHostAndPort(),
+ endpointStandalone0.getClientConfigBuilder().build())) {
+
+ pool.withResource(jedis -> {
+ jedis.set(testKey, testValue);
+ });
+
+ pool.withResource(jedis -> {
+ assertEquals(testValue, jedis.get(testKey));
+ });
+ }
+ }
+
+ @Test
+ public void testWithResourceReturnsConnectionToPool() {
+ try (JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHostAndPort(),
+ endpointStandalone0.getClientConfigBuilder().build())) {
+
+ pool.withResource(jedis -> {
+ assertThat(pool.getNumActive(), equalTo(1));
+ jedis.set("foo", "bar");
+ });
+
+ assertThat(pool.getNumActive(), equalTo(0));
+ }
+ }
+
+ @Test
+ public void testWithResourceGet() {
+ try (JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHostAndPort(),
+ endpointStandalone0.getClientConfigBuilder().build())) {
+
+ String result = pool.withResourceGet(jedis -> {
+ jedis.set(testKey, testValue);
+ return jedis.get(testKey);
+ });
+
+ assertEquals(testValue, result);
+ }
+ }
+
+ @Test
+ public void testWithResourceGetReturnsConnectionToPool() {
+ try (JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHostAndPort(),
+ endpointStandalone0.getClientConfigBuilder().build())) {
+
+ String result = pool.withResourceGet(jedis -> {
+ assertThat(pool.getNumActive(), equalTo(1));
+ jedis.set("foo", "bar");
+ return jedis.get("foo");
+ });
+
+ assertThat(result, equalTo("bar"));
+ assertThat(pool.getNumActive(), equalTo(0));
+ }
+ }
+
}
diff --git a/src/test/java/redis/clients/jedis/JedisPoolUnitTest.java b/src/test/java/redis/clients/jedis/JedisPoolUnitTest.java
new file mode 100644
index 0000000000..47f6ed3ee7
--- /dev/null
+++ b/src/test/java/redis/clients/jedis/JedisPoolUnitTest.java
@@ -0,0 +1,60 @@
+package redis.clients.jedis;
+
+import org.apache.commons.pool2.PooledObjectFactory;
+import org.apache.commons.pool2.impl.DefaultPooledObject;
+import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.*;
+
+public class JedisPoolUnitTest {
+
+ private JedisPool pool;
+ private Jedis mockJedis;
+
+ @BeforeEach
+ public void setUp() throws Exception {
+ mockJedis = mock(Jedis.class);
+ PooledObjectFactory mockFactory = mock(PooledObjectFactory.class);
+
+ when(mockFactory.makeObject()).thenReturn(new DefaultPooledObject<>(mockJedis));
+
+ GenericObjectPoolConfig config = new GenericObjectPoolConfig<>();
+ config.setMaxTotal(1);
+ pool = spy(new JedisPool(config, mockFactory));
+
+ }
+
+ @AfterEach
+ public void tearDown() {
+ if (pool != null && !pool.isClosed()) {
+ pool.close();
+ }
+ }
+
+ @Test
+ public void testWithResourceClosesConnection() {
+ pool.withResource(jedis -> assertEquals(mockJedis, jedis));
+
+ verify(mockJedis, times(1)).close();
+ }
+
+ @Test
+ public void testWithResourceGetClosesConnection() {
+ String result = pool.withResourceGet(jedis -> "test-result");
+
+ verify(mockJedis, times(1)).close();
+ }
+
+ @Test
+ public void testWithResourceGetReturnsResult() {
+ when(mockJedis.get(eq("test-key"))).thenReturn("test-result");
+ String result = pool.withResourceGet(jedis -> jedis.get("test-key"));
+
+ verify(mockJedis, times(1)).close();
+ }
+
+}