### Question:
AbstractOAuth2TokenService implements OAuth2TokenService, Cacheable { @Override public OAuth2TokenResponse retrieveAccessTokenViaJwtBearerTokenGrant(URI tokenEndpoint, ClientCredentials clientCredentials, String token, @Nullable String subdomain, @Nullable Map<String, String> optionalParameters, boolean disableCacheForRequest) throws OAuth2ServiceException { assertNotNull(tokenEndpoint, "tokenEndpoint is required"); assertNotNull(clientCredentials, "clientCredentials are required"); assertNotNull(token, "token is required"); Map<String, String> parameters = new RequestParameterBuilder() .withGrantType(GRANT_TYPE_JWT_BEARER) .withClientCredentials(clientCredentials) .withToken(token) .withOptionalParameters(optionalParameters) .buildAsMap(); HttpHeaders headers = HttpHeadersFactory.createWithoutAuthorizationHeader(); return getOAuth2TokenResponse(tokenEndpoint, headers, parameters, subdomain, disableCacheForRequest); } AbstractOAuth2TokenService();  AbstractOAuth2TokenService(TokenCacheConfiguration tokenCacheConfiguration);   AbstractOAuth2TokenService(TokenCacheConfiguration tokenCacheConfiguration, Ticker cacheTicker,
			boolean sameThreadCache); @Override void clearCache(); @Override @Nonnull TokenCacheConfiguration getCacheConfiguration(); @Override OAuth2TokenResponse retrieveAccessTokenViaClientCredentialsGrant(@Nonnull URI tokenEndpointUri,
			@Nonnull ClientCredentials clientCredentials,
			@Nullable String subdomain, @Nullable Map<String, String> optionalParameters,
			boolean disableCacheForRequest); @Override OAuth2TokenResponse retrieveAccessTokenViaUserTokenGrant(@Nonnull URI tokenEndpointUri,
			@Nonnull ClientCredentials clientCredentials, @Nonnull String token, @Nullable String subdomain,
			@Nullable Map<String, String> optionalParameters); @Override OAuth2TokenResponse retrieveAccessTokenViaRefreshToken(@Nonnull URI tokenEndpointUri,
			@Nonnull ClientCredentials clientCredentials,
			@Nonnull String refreshToken, String subdomain, boolean disableCacheForRequest); @Override OAuth2TokenResponse retrieveAccessTokenViaPasswordGrant(@Nonnull URI tokenEndpoint,
			@Nonnull ClientCredentials clientCredentials, @Nonnull String username, @Nonnull String password,
			@Nullable String subdomain, @Nullable Map<String, String> optionalParameters,
			boolean disableCacheForRequest); @Override OAuth2TokenResponse retrieveAccessTokenViaJwtBearerTokenGrant(URI tokenEndpoint,
			ClientCredentials clientCredentials, String token, @Nullable String subdomain,
			@Nullable Map<String, String> optionalParameters, boolean disableCacheForRequest); @Override Object getCacheStatistics();  }### Answer:
@Test public void retrieveAccessTokenViaJwtBearerTokenGrant_twoDistinctRequests_onlyTwoRequestCalls() throws OAuth2ServiceException { retrieveAccessTokenViaJwtBearerTokenGrant("token"); retrieveAccessTokenViaJwtBearerTokenGrant("differentToken"); retrieveAccessTokenViaJwtBearerTokenGrant("token"); assertThat(cut.tokenRequestCallCount).isEqualTo(2); }
@Test public void requestAccessToken_differentAdditionalParameters_requestsFreshToken() throws OAuth2ServiceException { retrieveAccessTokenViaJwtBearerTokenGrant("token", Maps.newHashMap("a", "b")); retrieveAccessTokenViaJwtBearerTokenGrant("token", Maps.newHashMap("1", "2")); assertThat(cut.tokenRequestCallCount).isEqualTo(2); }
@Test public void requestAccessToken_sameAdditionalParameters_onlyOneRequestCall() throws OAuth2ServiceException { Map<String, String> parameters = Maps.newHashMap("a", "b"); parameters.put("c", "d"); Map<String, String> sameParametersDifferentOrder = Maps.newHashMap("c", "d"); sameParametersDifferentOrder.put("a", "b"); retrieveAccessTokenViaJwtBearerTokenGrant("token", parameters); retrieveAccessTokenViaJwtBearerTokenGrant("token", sameParametersDifferentOrder); assertThat(cut.tokenRequestCallCount).isOne(); }