You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2021/09/24 20:13:16 UTC

[httpcomponents-client] 02/02: Cleanup of authentication test cases

This is an automated email from the ASF dual-hosted git repository.

olegk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/httpcomponents-client.git

commit a9092e869561353ba9269c662ba9190e3703e0d4
Author: Oleg Kalnichevski <ol...@apache.org>
AuthorDate: Fri Sep 24 16:07:20 2021 +0200

    Cleanup of authentication test cases
---
 .../AbstractHttpAsyncClientAuthentication.java     | 101 +++---
 .../async/TestHttp1ClientAuthentication.java       |  12 +-
 .../testing/sync/TestClientAuthentication.java     | 341 ++++++++++-----------
 3 files changed, 199 insertions(+), 255 deletions(-)

diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/async/AbstractHttpAsyncClientAuthentication.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/async/AbstractHttpAsyncClientAuthentication.java
index 7a0c7e3..d4893b2 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/async/AbstractHttpAsyncClientAuthentication.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/async/AbstractHttpAsyncClientAuthentication.java
@@ -41,8 +41,7 @@ import org.apache.hc.client5.http.auth.AuthScheme;
 import org.apache.hc.client5.http.auth.AuthSchemeFactory;
 import org.apache.hc.client5.http.auth.AuthScope;
 import org.apache.hc.client5.http.auth.ChallengeType;
-import org.apache.hc.client5.http.auth.Credentials;
-import org.apache.hc.client5.http.auth.CredentialsStore;
+import org.apache.hc.client5.http.auth.CredentialsProvider;
 import org.apache.hc.client5.http.auth.StandardAuthScheme;
 import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
 import org.apache.hc.client5.http.config.RequestConfig;
@@ -76,6 +75,7 @@ import org.apache.hc.core5.http2.impl.H2Processors;
 import org.apache.hc.core5.net.URIAuthority;
 import org.junit.Assert;
 import org.junit.Test;
+import org.mockito.Mockito;
 
 public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableHttpAsyncClient> extends AbstractIntegrationTestBase<T> {
 
@@ -110,42 +110,12 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
 
     abstract void setTargetAuthenticationStrategy(AuthenticationStrategy targetAuthStrategy);
 
-    static class TestCredentialsProvider implements CredentialsStore {
-
-        private final Credentials creds;
-        private AuthScope authscope;
-
-        TestCredentialsProvider(final Credentials creds) {
-            super();
-            this.creds = creds;
-        }
-
-        @Override
-        public void clear() {
-        }
-
-        @Override
-        public Credentials getCredentials(final AuthScope authscope, final HttpContext context) {
-            this.authscope = authscope;
-            return this.creds;
-        }
-
-        @Override
-        public void setCredentials(final AuthScope authscope, final Credentials credentials) {
-        }
-
-        public AuthScope getAuthScope() {
-            return this.authscope;
-        }
-
-    }
-
     @Test
     public void testBasicAuthenticationNoCreds() throws Exception {
         server.register("*", AsyncEchoHandler::new);
         final HttpHost target = start();
 
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(null);
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
         final HttpClientContext context = HttpClientContext.create();
         context.setCredentialsProvider(credsProvider);
 
@@ -157,9 +127,8 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
 
         Assert.assertNotNull(response);
         Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
+        Mockito.verify(credsProvider).getCredentials(
+                Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
 
     @Test
@@ -167,8 +136,9 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
         server.register("*", AsyncEchoHandler::new);
         final HttpHost target = start();
 
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "all-wrong".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "all-wrong".toCharArray()));
         final HttpClientContext context = HttpClientContext.create();
         context.setCredentialsProvider(credsProvider);
 
@@ -180,9 +150,8 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
 
         Assert.assertNotNull(response);
         Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
+        Mockito.verify(credsProvider).getCredentials(
+                Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
 
     @Test
@@ -190,8 +159,9 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
         server.register("*", AsyncEchoHandler::new);
         final HttpHost target = start();
 
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "test".toCharArray()));
         final HttpClientContext context = HttpClientContext.create();
         context.setCredentialsProvider(credsProvider);
 
@@ -204,9 +174,8 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
 
         Assert.assertNotNull(response);
         Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
+        Mockito.verify(credsProvider).getCredentials(
+                Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
 
     @Test
@@ -214,8 +183,9 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
         server.register("*", AsyncEchoHandler::new);
         final HttpHost target = start();
 
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "test".toCharArray()));
         final HttpClientContext context = HttpClientContext.create();
         context.setCredentialsProvider(credsProvider);
         final Future<SimpleHttpResponse> future = httpclient.execute(
@@ -228,9 +198,8 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
 
         Assert.assertNotNull(response);
         Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
+        Mockito.verify(credsProvider).getCredentials(
+                Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
 
     @Test
@@ -238,8 +207,9 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
         server.register("*", AsyncEchoHandler::new);
         final HttpHost target = start();
 
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "all-wrong".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "all-wrong".toCharArray()));
         final HttpClientContext context = HttpClientContext.create();
         context.setCredentialsProvider(credsProvider);
         context.setRequestConfig(RequestConfig.custom().setExpectContinueEnabled(true).build());
@@ -260,8 +230,9 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
         server.register("*", AsyncEchoHandler::new);
         final HttpHost target = start();
 
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "test".toCharArray()));
         final HttpClientContext context = HttpClientContext.create();
         context.setCredentialsProvider(credsProvider);
         context.setRequestConfig(RequestConfig.custom().setExpectContinueEnabled(true).build());
@@ -275,9 +246,8 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
 
         Assert.assertNotNull(response);
         Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
+        Mockito.verify(credsProvider).getCredentials(
+                Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
 
     @Test
@@ -388,8 +358,9 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
     @Test
     public void testReauthentication() throws Exception {
         server.register("*", AsyncEchoHandler::new);
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "test".toCharArray()));
 
         final Registry<AuthSchemeFactory> authSchemeRegistry = RegistryBuilder.<AuthSchemeFactory>create()
                 .register("MyBasic", context -> new BasicScheme() {
@@ -462,8 +433,9 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
 
                 });
 
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "test".toCharArray()));
         final HttpClientContext context = HttpClientContext.create();
         context.setCredentialsProvider(credsProvider);
 
@@ -474,9 +446,8 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
         final SimpleHttpResponse response = future.get();
         Assert.assertNotNull(response);
         Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
+        Mockito.verify(credsProvider).getCredentials(
+                Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
 
 }
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/async/TestHttp1ClientAuthentication.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/async/TestHttp1ClientAuthentication.java
index b4b049d..d8ff129 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/async/TestHttp1ClientAuthentication.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/async/TestHttp1ClientAuthentication.java
@@ -36,6 +36,7 @@ import org.apache.hc.client5.http.async.methods.SimpleHttpResponse;
 import org.apache.hc.client5.http.async.methods.SimpleRequestBuilder;
 import org.apache.hc.client5.http.auth.AuthSchemeFactory;
 import org.apache.hc.client5.http.auth.AuthScope;
+import org.apache.hc.client5.http.auth.CredentialsProvider;
 import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
 import org.apache.hc.client5.http.config.ConnectionConfig;
 import org.apache.hc.client5.http.config.RequestConfig;
@@ -63,6 +64,7 @@ import org.junit.Test;
 import org.junit.rules.ExternalResource;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
+import org.mockito.Mockito;
 
 @RunWith(Parameterized.class)
 public class TestHttp1ClientAuthentication extends AbstractHttpAsyncClientAuthentication<CloseableHttpAsyncClient> {
@@ -149,8 +151,9 @@ public class TestHttp1ClientAuthentication extends AbstractHttpAsyncClientAuthen
                 },
                 Http1Config.DEFAULT);
 
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "test".toCharArray()));
         final HttpClientContext context = HttpClientContext.create();
         context.setCredentialsProvider(credsProvider);
 
@@ -163,9 +166,8 @@ public class TestHttp1ClientAuthentication extends AbstractHttpAsyncClientAuthen
 
         Assert.assertNotNull(response);
         Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
+        Mockito.verify(credsProvider).getCredentials(
+                Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
 
 }
\ No newline at end of file
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestClientAuthentication.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestClientAuthentication.java
index e443375..225b841 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestClientAuthentication.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestClientAuthentication.java
@@ -31,17 +31,12 @@ import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.nio.charset.StandardCharsets;
 import java.util.Collections;
-import java.util.List;
-import java.util.Map;
 import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.hc.client5.http.auth.AuthCache;
-import org.apache.hc.client5.http.auth.AuthChallenge;
 import org.apache.hc.client5.http.auth.AuthScheme;
 import org.apache.hc.client5.http.auth.AuthSchemeFactory;
 import org.apache.hc.client5.http.auth.AuthScope;
-import org.apache.hc.client5.http.auth.ChallengeType;
-import org.apache.hc.client5.http.auth.Credentials;
 import org.apache.hc.client5.http.auth.CredentialsProvider;
 import org.apache.hc.client5.http.auth.StandardAuthScheme;
 import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
@@ -82,6 +77,7 @@ import org.apache.hc.core5.http.protocol.HttpCoreContext;
 import org.apache.hc.core5.net.URIAuthority;
 import org.junit.Assert;
 import org.junit.Test;
+import org.mockito.Mockito;
 
 /**
  * Unit tests for automatic client authentication.
@@ -97,46 +93,24 @@ public class TestClientAuthentication extends LocalServerTestBase {
         return start(new BasicTestAuthenticator("test:test", "test realm"));
     }
 
-    static class TestCredentialsProvider implements CredentialsProvider {
-
-        private final Credentials creds;
-        private AuthScope authscope;
-
-        TestCredentialsProvider(final Credentials creds) {
-            super();
-            this.creds = creds;
-        }
-
-        @Override
-        public Credentials getCredentials(final AuthScope authscope, final HttpContext context) {
-            this.authscope = authscope;
-            return this.creds;
-        }
-
-        public AuthScope getAuthScope() {
-            return this.authscope;
-        }
-
-    }
-
     @Test
     public void testBasicAuthenticationNoCreds() throws Exception {
         this.server.registerHandler("*", new EchoHandler());
         final HttpHost target = start();
 
         final HttpClientContext context = HttpClientContext.create();
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(null);
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
         context.setCredentialsProvider(credsProvider);
         final HttpGet httpget = new HttpGet("/");
 
-        final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
-        Assert.assertNotNull(entity);
-        EntityUtils.consume(entity);
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
+        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+            final HttpEntity entity = response.getEntity();
+            Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
+            Assert.assertNotNull(entity);
+            EntityUtils.consume(entity);
+        }
+        Mockito.verify(credsProvider).getCredentials(
+                Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
 
     @Test
@@ -145,19 +119,20 @@ public class TestClientAuthentication extends LocalServerTestBase {
         final HttpHost target = start();
 
         final HttpClientContext context = HttpClientContext.create();
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "all-wrong".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "all-wrong".toCharArray()));
         context.setCredentialsProvider(credsProvider);
         final HttpGet httpget = new HttpGet("/");
 
-        final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
-        Assert.assertNotNull(entity);
-        EntityUtils.consume(entity);
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
+        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+            final HttpEntity entity = response.getEntity();
+            Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
+            Assert.assertNotNull(entity);
+            EntityUtils.consume(entity);
+        }
+        Mockito.verify(credsProvider).getCredentials(
+                Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
 
     @Test
@@ -165,20 +140,21 @@ public class TestClientAuthentication extends LocalServerTestBase {
         this.server.registerHandler("*", new EchoHandler());
         final HttpGet httpget = new HttpGet("/");
         final HttpClientContext context = HttpClientContext.create();
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "test".toCharArray()));
         context.setCredentialsProvider(credsProvider);
 
         final HttpHost target = start();
 
-        final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-        Assert.assertNotNull(entity);
-        EntityUtils.consume(entity);
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
+        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+            final HttpEntity entity = response.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
+            Assert.assertNotNull(entity);
+            EntityUtils.consume(entity);
+        }
+        Mockito.verify(credsProvider).getCredentials(
+                Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
 
     @Test
@@ -196,14 +172,16 @@ public class TestClientAuthentication extends LocalServerTestBase {
                         new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 } ),
                         -1, null));
         final HttpClientContext context = HttpClientContext.create();
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "test".toCharArray()));
         context.setCredentialsProvider(credsProvider);
 
-        final ClassicHttpResponse response = this.httpclient.execute(target, httpput, context);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-        Assert.assertNotNull(entity);
+        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpput, context)) {
+            final HttpEntity entity = response.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
+            Assert.assertNotNull(entity);
+        }
     }
 
     @Test
@@ -220,15 +198,17 @@ public class TestClientAuthentication extends LocalServerTestBase {
                         -1, null));
 
         final HttpClientContext context = HttpClientContext.create();
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "boom".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "boom".toCharArray()));
         context.setCredentialsProvider(credsProvider);
 
-        final CloseableHttpResponse response = this.httpclient.execute(target, httpput, context);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(401, response.getCode());
-        Assert.assertNotNull(entity);
-        EntityUtils.consume(entity);
+        try (final CloseableHttpResponse response = this.httpclient.execute(target, httpput, context)) {
+            final HttpEntity entity = response.getEntity();
+            Assert.assertEquals(401, response.getCode());
+            Assert.assertNotNull(entity);
+            EntityUtils.consume(entity);
+        }
     }
 
     @Test
@@ -240,18 +220,19 @@ public class TestClientAuthentication extends LocalServerTestBase {
         httppost.setEntity(new StringEntity("some important stuff", StandardCharsets.US_ASCII));
 
         final HttpClientContext context = HttpClientContext.create();
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "test".toCharArray()));
         context.setCredentialsProvider(credsProvider);
 
-        final ClassicHttpResponse response = this.httpclient.execute(target, httppost, context);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-        Assert.assertNotNull(entity);
-        EntityUtils.consume(entity);
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
+        try (final ClassicHttpResponse response = this.httpclient.execute(target, httppost, context)) {
+            final HttpEntity entity = response.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
+            Assert.assertNotNull(entity);
+            EntityUtils.consume(entity);
+        }
+        Mockito.verify(credsProvider).getCredentials(
+                Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
 
     @Test
@@ -268,46 +249,23 @@ public class TestClientAuthentication extends LocalServerTestBase {
         context.setRequestConfig(RequestConfig.custom()
                 .setExpectContinueEnabled(false)
                 .build());
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "test".toCharArray()));
         context.setCredentialsProvider(credsProvider);
 
-        final CloseableHttpResponse response = this.httpclient.execute(target, httppost, context);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(401, response.getCode());
-        Assert.assertNotNull(entity);
-        EntityUtils.consume(entity);
-    }
-
-    static class TestTargetAuthenticationStrategy extends DefaultAuthenticationStrategy {
-
-        private final AtomicLong count;
-
-        public TestTargetAuthenticationStrategy() {
-            super();
-            this.count = new AtomicLong();
+        try (final CloseableHttpResponse response = this.httpclient.execute(target, httppost, context)) {
+            final HttpEntity entity = response.getEntity();
+            Assert.assertEquals(401, response.getCode());
+            Assert.assertNotNull(entity);
+            EntityUtils.consume(entity);
         }
-
-        @Override
-        public List<AuthScheme> select(
-                final ChallengeType challengeType,
-                final Map<String, AuthChallenge> challenges,
-                final HttpContext context) {
-            final List<AuthScheme> authSchemes = super.select(challengeType, challenges, context);
-            this.count.incrementAndGet();
-            return authSchemes;
-        }
-
-        public long getCount() {
-            return this.count.get();
-        }
-
     }
 
     @Test
     public void testBasicAuthenticationCredentialsCaching() throws Exception {
         this.server.registerHandler("*", new EchoHandler());
-        final TestTargetAuthenticationStrategy authStrategy = new TestTargetAuthenticationStrategy();
+        final DefaultAuthenticationStrategy authStrategy = Mockito.spy(new DefaultAuthenticationStrategy());
         this.clientBuilder.setTargetAuthenticationStrategy(authStrategy);
 
         final HttpHost target = start();
@@ -319,19 +277,21 @@ public class TestClientAuthentication extends LocalServerTestBase {
 
         final HttpGet httpget = new HttpGet("/");
 
-        final ClassicHttpResponse response1 = this.httpclient.execute(target, httpget, context);
-        final HttpEntity entity1 = response1.getEntity();
-        Assert.assertEquals(HttpStatus.SC_OK, response1.getCode());
-        Assert.assertNotNull(entity1);
-        EntityUtils.consume(entity1);
+        try (final ClassicHttpResponse response1 = this.httpclient.execute(target, httpget, context)) {
+            final HttpEntity entity1 = response1.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response1.getCode());
+            Assert.assertNotNull(entity1);
+            EntityUtils.consume(entity1);
+        }
 
-        final ClassicHttpResponse response2 = this.httpclient.execute(target, httpget, context);
-        final HttpEntity entity2 = response1.getEntity();
-        Assert.assertEquals(HttpStatus.SC_OK, response2.getCode());
-        Assert.assertNotNull(entity2);
-        EntityUtils.consume(entity2);
+        try (final ClassicHttpResponse response2 = this.httpclient.execute(target, httpget, context)) {
+            final HttpEntity entity2 = response2.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response2.getCode());
+            Assert.assertNotNull(entity2);
+            EntityUtils.consume(entity2);
+        }
 
-        Assert.assertEquals(1, authStrategy.getCount());
+        Mockito.verify(authStrategy).select(Mockito.any(), Mockito.any(), Mockito.any());
     }
 
     @Test
@@ -363,7 +323,7 @@ public class TestClientAuthentication extends LocalServerTestBase {
 
         });
 
-        final TestTargetAuthenticationStrategy authStrategy = new TestTargetAuthenticationStrategy();
+        final DefaultAuthenticationStrategy authStrategy = Mockito.spy(new DefaultAuthenticationStrategy());
         final CredentialsProvider credsProvider = CredentialsProviderBuilder.create()
                 .add(new AuthScope(target, "this realm", null), "test", "this".toCharArray())
                 .add(new AuthScope(target, "that realm", null), "test", "that".toCharArray())
@@ -377,29 +337,32 @@ public class TestClientAuthentication extends LocalServerTestBase {
 
         final HttpGet httpget1 = new HttpGet("/this");
 
-        final ClassicHttpResponse response1 = this.httpclient.execute(target, httpget1, context);
-        final HttpEntity entity1 = response1.getEntity();
-        Assert.assertEquals(HttpStatus.SC_OK, response1.getCode());
-        Assert.assertNotNull(entity1);
-        EntityUtils.consume(entity1);
+        try (final ClassicHttpResponse response1 = this.httpclient.execute(target, httpget1, context)) {
+            final HttpEntity entity1 = response1.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response1.getCode());
+            Assert.assertNotNull(entity1);
+            EntityUtils.consume(entity1);
+        }
 
         final HttpGet httpget2 = new HttpGet("/this");
 
-        final ClassicHttpResponse response2 = this.httpclient.execute(target, httpget2, context);
-        final HttpEntity entity2 = response1.getEntity();
-        Assert.assertEquals(HttpStatus.SC_OK, response2.getCode());
-        Assert.assertNotNull(entity2);
-        EntityUtils.consume(entity2);
+        try (final ClassicHttpResponse response2 = this.httpclient.execute(target, httpget2, context)) {
+            final HttpEntity entity2 = response2.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response2.getCode());
+            Assert.assertNotNull(entity2);
+            EntityUtils.consume(entity2);
+        }
 
         final HttpGet httpget3 = new HttpGet("/that");
 
-        final ClassicHttpResponse response3 = this.httpclient.execute(target, httpget3, context);
-        final HttpEntity entity3 = response1.getEntity();
-        Assert.assertEquals(HttpStatus.SC_OK, response3.getCode());
-        Assert.assertNotNull(entity3);
-        EntityUtils.consume(entity3);
+        try (final ClassicHttpResponse response3 = this.httpclient.execute(target, httpget3, context)) {
+            final HttpEntity entity3 = response3.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response3.getCode());
+            Assert.assertNotNull(entity3);
+            EntityUtils.consume(entity3);
+        }
 
-        Assert.assertEquals(2, authStrategy.getCount());
+        Mockito.verify(authStrategy, Mockito.times(2)).select(Mockito.any(), Mockito.any(), Mockito.any());
     }
 
     @Test
@@ -409,11 +372,12 @@ public class TestClientAuthentication extends LocalServerTestBase {
         final HttpGet httpget = new HttpGet("http://test:test@" +  target.toHostString() + "/");
 
         final HttpClientContext context = HttpClientContext.create();
-        final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-        Assert.assertNotNull(entity);
-        EntityUtils.consume(entity);
+        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+            final HttpEntity entity = response.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
+            Assert.assertNotNull(entity);
+            EntityUtils.consume(entity);
+        }
     }
 
     @Test
@@ -423,11 +387,12 @@ public class TestClientAuthentication extends LocalServerTestBase {
         final HttpGet httpget = new HttpGet("http://test:all-wrong@" +  target.toHostString() + "/");
 
         final HttpClientContext context = HttpClientContext.create();
-        final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
-        Assert.assertNotNull(entity);
-        EntityUtils.consume(entity);
+        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+            final HttpEntity entity = response.getEntity();
+            Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
+            Assert.assertNotNull(entity);
+            EntityUtils.consume(entity);
+        }
     }
 
     @Test
@@ -455,11 +420,12 @@ public class TestClientAuthentication extends LocalServerTestBase {
         final HttpGet httpget = new HttpGet("/thatway");
         final HttpClientContext context = HttpClientContext.create();
 
-        final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-        Assert.assertNotNull(entity);
-        EntityUtils.consume(entity);
+        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+            final HttpEntity entity = response.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
+            Assert.assertNotNull(entity);
+            EntityUtils.consume(entity);
+        }
     }
 
     static class CountingAuthenticator extends BasicTestAuthenticator {
@@ -497,11 +463,12 @@ public class TestClientAuthentication extends LocalServerTestBase {
         context.setAuthCache(authCache);
 
         final HttpGet httpget = new HttpGet("/");
-        final ClassicHttpResponse response1 = this.httpclient.execute(target, httpget, context);
-        final HttpEntity entity1 = response1.getEntity();
-        Assert.assertEquals(HttpStatus.SC_OK, response1.getCode());
-        Assert.assertNotNull(entity1);
-        EntityUtils.consume(entity1);
+        try (final ClassicHttpResponse response1 = this.httpclient.execute(target, httpget, context)) {
+            final HttpEntity entity1 = response1.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response1.getCode());
+            Assert.assertNotNull(entity1);
+            EntityUtils.consume(entity1);
+        }
 
         Assert.assertEquals(1, countingAuthenticator.getCount());
     }
@@ -522,11 +489,12 @@ public class TestClientAuthentication extends LocalServerTestBase {
                 .build());
 
         final HttpGet httpget = new HttpGet("/");
-        final ClassicHttpResponse response1 = this.httpclient.execute(target, httpget, context);
-        final HttpEntity entity1 = response1.getEntity();
-        Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response1.getCode());
-        Assert.assertNotNull(entity1);
-        EntityUtils.consume(entity1);
+        try (final ClassicHttpResponse response1 = this.httpclient.execute(target, httpget, context)) {
+            final HttpEntity entity1 = response1.getEntity();
+            Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response1.getCode());
+            Assert.assertNotNull(entity1);
+            EntityUtils.consume(entity1);
+        }
 
         Assert.assertEquals(1, countingAuthenticator.getCount());
     }
@@ -557,15 +525,15 @@ public class TestClientAuthentication extends LocalServerTestBase {
         final HttpHost target = super.start();
 
         final HttpClientContext context = HttpClientContext.create();
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(null);
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
         context.setCredentialsProvider(credsProvider);
 
         final HttpGet httpget = new HttpGet("/");
-        final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(HttpStatus.SC_PROXY_AUTHENTICATION_REQUIRED,
-                response.getCode());
-        EntityUtils.consume(entity);
+        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+            final HttpEntity entity = response.getEntity();
+            Assert.assertEquals(HttpStatus.SC_PROXY_AUTHENTICATION_REQUIRED, response.getCode());
+            EntityUtils.consume(entity);
+        }
     }
 
     @Test
@@ -592,9 +560,10 @@ public class TestClientAuthentication extends LocalServerTestBase {
         for (int i = 0; i < 2; i++) {
             final HttpGet httpget = new HttpGet("/");
 
-            final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context);
-            EntityUtils.consume(response.getEntity());
-            Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
+            try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+                EntityUtils.consume(response.getEntity());
+                Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
+            }
         }
     }
 
@@ -619,8 +588,9 @@ public class TestClientAuthentication extends LocalServerTestBase {
 
         };
 
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "test".toCharArray()));
 
         final RequestConfig config = RequestConfig.custom()
                 .setTargetPreferredAuthSchemes(Collections.singletonList("MyBasic"))
@@ -688,19 +658,20 @@ public class TestClientAuthentication extends LocalServerTestBase {
                 });
 
         final HttpClientContext context = HttpClientContext.create();
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "test".toCharArray()));
         context.setCredentialsProvider(credsProvider);
         final HttpGet httpget = new HttpGet("/");
 
-        final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-        Assert.assertNotNull(entity);
-        EntityUtils.consume(entity);
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
+        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+            final HttpEntity entity = response.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
+            Assert.assertNotNull(entity);
+            EntityUtils.consume(entity);
+        }
+        Mockito.verify(credsProvider).getCredentials(
+                Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
 
 }