Skip to content

Commit

Permalink
Replace TestNG with JUnit + Rules
Browse files Browse the repository at this point in the history
JUnit Rules, such as MockWebServerRule, reduce boilerplate setup present
in our tests. By migrating off TestNG, and onto rules, our tests become
more maintainable as JUnit is well understood.
  • Loading branch information
Adrian Cole committed Jan 25, 2015
1 parent 32c32e7 commit 0f3947a
Show file tree
Hide file tree
Showing 32 changed files with 908 additions and 1,080 deletions.
8 changes: 2 additions & 6 deletions core/build.gradle
Expand Up @@ -2,14 +2,10 @@ apply plugin: 'java'


sourceCompatibility = 1.6 sourceCompatibility = 1.6


test {
useTestNG()
}

dependencies { dependencies {
testCompile 'com.google.guava:guava:14.0.1' testCompile 'com.google.guava:guava:14.0.1'
testCompile 'com.google.code.gson:gson:2.2.4' testCompile 'com.google.code.gson:gson:2.2.4'
testCompile 'com.fasterxml.jackson.core:jackson-databind:2.2.2' testCompile 'com.fasterxml.jackson.core:jackson-databind:2.2.2'
testCompile 'org.testng:testng:6.8.5' testCompile 'junit:junit:4.12'
testCompile 'com.google.mockwebserver:mockwebserver:20130706' testCompile 'com.squareup.okhttp:mockwebserver:2.2.0'
} }
131 changes: 67 additions & 64 deletions core/src/test/java/feign/DefaultContractTest.java
Expand Up @@ -16,28 +16,29 @@
package feign; package feign;


import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
import org.testng.annotations.Test;

import javax.inject.Named;
import java.net.URI; import java.net.URI;
import java.util.Arrays;
import java.util.List; import java.util.List;

import javax.inject.Named;
import static org.testng.Assert.assertEquals; import org.junit.Rule;
import static org.testng.Assert.assertFalse; import org.junit.Test;
import static org.testng.Assert.assertNull; import org.junit.rules.ExpectedException;
import static org.testng.Assert.assertTrue;


import static feign.Util.UTF_8; import static feign.Util.UTF_8;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;


/** /**
* Tests interfaces defined per {@link Contract.Default} are interpreted into expected {@link feign * Tests interfaces defined per {@link Contract.Default} are interpreted into expected {@link feign
* .RequestTemplate template} * .RequestTemplate template}
* instances. * instances.
*/ */
@Test
public class DefaultContractTest { public class DefaultContractTest {
@Rule public final ExpectedException thrown = ExpectedException.none();

Contract.Default contract = new Contract.Default(); Contract.Default contract = new Contract.Default();


interface Methods { interface Methods {
Expand All @@ -51,14 +52,14 @@ interface Methods {
} }


@Test public void httpMethods() throws Exception { @Test public void httpMethods() throws Exception {
assertEquals(contract.parseAndValidatateMetadata(Methods.class.getDeclaredMethod("post")).template().method(), assertEquals("POST",
"POST"); contract.parseAndValidatateMetadata(Methods.class.getDeclaredMethod("post")).template().method());
assertEquals(contract.parseAndValidatateMetadata(Methods.class.getDeclaredMethod("put")).template().method(), assertEquals("PUT",
"PUT"); contract.parseAndValidatateMetadata(Methods.class.getDeclaredMethod("put")).template().method());
assertEquals(contract.parseAndValidatateMetadata(Methods.class.getDeclaredMethod("get")).template().method(), assertEquals("GET",
"GET"); contract.parseAndValidatateMetadata(Methods.class.getDeclaredMethod("get")).template().method());
assertEquals(contract.parseAndValidatateMetadata(Methods.class.getDeclaredMethod("delete")).template().method(), assertEquals("DELETE",
"DELETE"); contract.parseAndValidatateMetadata(Methods.class.getDeclaredMethod("delete")).template().method());
} }


interface BodyParams { interface BodyParams {
Expand All @@ -78,9 +79,11 @@ interface BodyParams {
}.getType()); }.getType());
} }


@Test(expectedExceptions = IllegalStateException.class, expectedExceptionsMessageRegExp = "Method has too many Body.*") @Test public void tooManyBodies() throws Exception {
public void tooManyBodies() throws Exception { thrown.expect(IllegalStateException.class);
contract.parseAndValidatateMetadata(BodyParams.class.getDeclaredMethod("tooMany", List.class, List.class)); thrown.expectMessage("Method has too many Body");
contract.parseAndValidatateMetadata(
BodyParams.class.getDeclaredMethod("tooMany", List.class, List.class));
} }


interface CustomMethodAndURIParam { interface CustomMethodAndURIParam {
Expand All @@ -90,13 +93,13 @@ interface CustomMethodAndURIParam {
@Test public void requestLineOnlyRequiresMethod() throws Exception { @Test public void requestLineOnlyRequiresMethod() throws Exception {
MethodMetadata md = contract.parseAndValidatateMetadata(CustomMethodAndURIParam.class.getDeclaredMethod("patch", MethodMetadata md = contract.parseAndValidatateMetadata(CustomMethodAndURIParam.class.getDeclaredMethod("patch",
URI.class)); URI.class));
assertEquals(md.template().method(), "PATCH"); assertEquals("PATCH", md.template().method());
assertEquals(md.template().url(), ""); assertEquals("", md.template().url());
assertTrue(md.template().queries().isEmpty()); assertTrue(md.template().queries().isEmpty());
assertTrue(md.template().headers().isEmpty()); assertTrue(md.template().headers().isEmpty());
assertNull(md.template().body()); assertNull(md.template().body());
assertNull(md.template().bodyTemplate()); assertNull(md.template().bodyTemplate());
assertEquals(md.urlIndex(), Integer.valueOf(0)); assertEquals(Integer.valueOf(0), md.urlIndex());
} }


interface WithQueryParamsInPath { interface WithQueryParamsInPath {
Expand All @@ -114,38 +117,38 @@ interface WithQueryParamsInPath {
@Test public void queryParamsInPathExtract() throws Exception { @Test public void queryParamsInPathExtract() throws Exception {
{ {
MethodMetadata md = contract.parseAndValidatateMetadata(WithQueryParamsInPath.class.getDeclaredMethod("none")); MethodMetadata md = contract.parseAndValidatateMetadata(WithQueryParamsInPath.class.getDeclaredMethod("none"));
assertEquals(md.template().url(), "/"); assertEquals("/", md.template().url());
assertTrue(md.template().queries().isEmpty()); assertTrue(md.template().queries().isEmpty());
assertEquals(md.template().toString(), "GET / HTTP/1.1\n"); assertEquals("GET / HTTP/1.1\n", md.template().toString());
} }
{ {
MethodMetadata md = contract.parseAndValidatateMetadata(WithQueryParamsInPath.class.getDeclaredMethod("one")); MethodMetadata md = contract.parseAndValidatateMetadata(WithQueryParamsInPath.class.getDeclaredMethod("one"));
assertEquals(md.template().url(), "/"); assertEquals("/", md.template().url());
assertEquals(md.template().queries().get("Action"), ImmutableSet.of("GetUser")); assertEquals(Arrays.asList("GetUser"), md.template().queries().get("Action"));
assertEquals(md.template().toString(), "GET /?Action=GetUser HTTP/1.1\n"); assertEquals("GET /?Action=GetUser HTTP/1.1\n", md.template().toString());
} }
{ {
MethodMetadata md = contract.parseAndValidatateMetadata(WithQueryParamsInPath.class.getDeclaredMethod("two")); MethodMetadata md = contract.parseAndValidatateMetadata(WithQueryParamsInPath.class.getDeclaredMethod("two"));
assertEquals(md.template().url(), "/"); assertEquals("/", md.template().url());
assertEquals(md.template().queries().get("Action"), ImmutableSet.of("GetUser")); assertEquals(Arrays.asList("GetUser"), md.template().queries().get("Action"));
assertEquals(md.template().queries().get("Version"), ImmutableSet.of("2010-05-08")); assertEquals(Arrays.asList("2010-05-08"), md.template().queries().get("Version"));
assertEquals(md.template().toString(), "GET /?Action=GetUser&Version=2010-05-08 HTTP/1.1\n"); assertEquals("GET /?Action=GetUser&Version=2010-05-08 HTTP/1.1\n", md.template().toString());
} }
{ {
MethodMetadata md = contract.parseAndValidatateMetadata(WithQueryParamsInPath.class.getDeclaredMethod("three")); MethodMetadata md = contract.parseAndValidatateMetadata(WithQueryParamsInPath.class.getDeclaredMethod("three"));
assertEquals(md.template().url(), "/"); assertEquals("/", md.template().url());
assertEquals(md.template().queries().get("Action"), ImmutableSet.of("GetUser")); assertEquals(Arrays.asList("GetUser"), md.template().queries().get("Action"));
assertEquals(md.template().queries().get("Version"), ImmutableSet.of("2010-05-08")); assertEquals(Arrays.asList("2010-05-08"), md.template().queries().get("Version"));
assertEquals(md.template().queries().get("limit"), ImmutableSet.of("1")); assertEquals(Arrays.asList("1"), md.template().queries().get("limit"));
assertEquals(md.template().toString(), "GET /?Action=GetUser&Version=2010-05-08&limit=1 HTTP/1.1\n"); assertEquals("GET /?Action=GetUser&Version=2010-05-08&limit=1 HTTP/1.1\n", md.template().toString());
} }
{ {
MethodMetadata md = contract.parseAndValidatateMetadata(WithQueryParamsInPath.class.getDeclaredMethod("empty")); MethodMetadata md = contract.parseAndValidatateMetadata(WithQueryParamsInPath.class.getDeclaredMethod("empty"));
assertEquals(md.template().url(), "/"); assertEquals("/", md.template().url());
assertTrue(md.template().queries().containsKey("flag")); assertTrue(md.template().queries().containsKey("flag"));
assertEquals(md.template().queries().get("Action"), ImmutableSet.of("GetUser")); assertEquals(Arrays.asList("GetUser"), md.template().queries().get("Action"));
assertEquals(md.template().queries().get("Version"), ImmutableSet.of("2010-05-08")); assertEquals(Arrays.asList("2010-05-08"), md.template().queries().get("Version"));
assertEquals(md.template().toString(), "GET /?flag&Action=GetUser&Version=2010-05-08 HTTP/1.1\n"); assertEquals("GET /?flag&Action=GetUser&Version=2010-05-08 HTTP/1.1\n", md.template().toString());
} }
} }


Expand All @@ -156,17 +159,16 @@ interface BodyWithoutParameters {
} }


@Test public void bodyWithoutParameters() throws Exception { @Test public void bodyWithoutParameters() throws Exception {
String expectedBody = "<v01:getAccountsListOfUser/>";
MethodMetadata md = contract.parseAndValidatateMetadata(BodyWithoutParameters.class.getDeclaredMethod("post")); MethodMetadata md = contract.parseAndValidatateMetadata(BodyWithoutParameters.class.getDeclaredMethod("post"));
assertEquals(md.template().body(), expectedBody.getBytes(UTF_8)); assertEquals("<v01:getAccountsListOfUser/>", new String(md.template().body(), UTF_8));
assertFalse(md.template().bodyTemplate() != null); assertFalse(md.template().bodyTemplate() != null);
assertTrue(md.formParams().isEmpty()); assertTrue(md.formParams().isEmpty());
assertTrue(md.indexToName().isEmpty()); assertTrue(md.indexToName().isEmpty());
} }


@Test public void producesAddsContentTypeHeader() throws Exception { @Test public void producesAddsContentTypeHeader() throws Exception {
MethodMetadata md = contract.parseAndValidatateMetadata(BodyWithoutParameters.class.getDeclaredMethod("post")); MethodMetadata md = contract.parseAndValidatateMetadata(BodyWithoutParameters.class.getDeclaredMethod("post"));
assertEquals(md.template().headers().get("Content-Type"), ImmutableSet.of("application/xml")); assertEquals(Arrays.asList("application/xml"), md.template().headers().get("Content-Type"));
} }


interface WithURIParam { interface WithURIParam {
Expand All @@ -176,15 +178,15 @@ interface WithURIParam {
@Test public void methodCanHaveUriParam() throws Exception { @Test public void methodCanHaveUriParam() throws Exception {
MethodMetadata md = contract.parseAndValidatateMetadata(WithURIParam.class.getDeclaredMethod("uriParam", String.class, MethodMetadata md = contract.parseAndValidatateMetadata(WithURIParam.class.getDeclaredMethod("uriParam", String.class,
URI.class, String.class)); URI.class, String.class));
assertEquals(md.urlIndex(), Integer.valueOf(1)); assertEquals(Integer.valueOf(1), md.urlIndex());
} }


@Test public void pathParamsParseIntoIndexToName() throws Exception { @Test public void pathParamsParseIntoIndexToName() throws Exception {
MethodMetadata md = contract.parseAndValidatateMetadata(WithURIParam.class.getDeclaredMethod("uriParam", String.class, MethodMetadata md = contract.parseAndValidatateMetadata(WithURIParam.class.getDeclaredMethod("uriParam", String.class,
URI.class, String.class)); URI.class, String.class));
assertEquals(md.template().url(), "/{1}/{2}"); assertEquals("/{1}/{2}", md.template().url());
assertEquals(md.indexToName().get(0), ImmutableSet.of("1")); assertEquals(Arrays.asList("1"), md.indexToName().get(0));
assertEquals(md.indexToName().get(2), ImmutableSet.of("2")); assertEquals(Arrays.asList("2"), md.indexToName().get(2));
} }


interface WithPathAndQueryParams { interface WithPathAndQueryParams {
Expand All @@ -199,13 +201,13 @@ Response recordsByNameAndType(@Named("domainId") int id, @Named("name") String n
assertNull(md.template().body()); assertNull(md.template().body());
assertNull(md.template().bodyTemplate()); assertNull(md.template().bodyTemplate());
assertTrue(md.template().headers().isEmpty()); assertTrue(md.template().headers().isEmpty());
assertEquals(md.template().url(), "/domains/{domainId}/records"); assertEquals("/domains/{domainId}/records", md.template().url());
assertEquals(md.template().queries().get("name"), ImmutableSet.of("{name}")); assertEquals(Arrays.asList("{name}"), md.template().queries().get("name"));
assertEquals(md.template().queries().get("type"), ImmutableSet.of("{type}")); assertEquals(Arrays.asList("{type}"), md.template().queries().get("type"));
assertEquals(md.indexToName().get(0), ImmutableSet.of("domainId")); assertEquals(Arrays.asList("domainId"), md.indexToName().get(0));
assertEquals(md.indexToName().get(1), ImmutableSet.of("name")); assertEquals(Arrays.asList("name"), md.indexToName().get(1));
assertEquals(md.indexToName().get(2), ImmutableSet.of("type")); assertEquals(Arrays.asList("type"), md.indexToName().get(2));
assertEquals(md.template().toString(), "GET /domains/{domainId}/records?name={name}&type={type} HTTP/1.1\n"); assertEquals("GET /domains/{domainId}/records?name={name}&type={type} HTTP/1.1\n", md.template().toString());
} }


interface FormParams { interface FormParams {
Expand All @@ -221,12 +223,13 @@ void login(
String.class, String.class)); String.class, String.class));


assertFalse(md.template().body() != null); assertFalse(md.template().body() != null);
assertEquals(md.template().bodyTemplate(), assertEquals(
"%7B\"customer_name\": \"{customer_name}\", \"user_name\": \"{user_name}\", \"password\": \"{password}\"%7D"); "%7B\"customer_name\": \"{customer_name}\", \"user_name\": \"{user_name}\", \"password\": \"{password}\"%7D",
assertEquals(md.formParams(), ImmutableList.of("customer_name", "user_name", "password")); md.template().bodyTemplate());
assertEquals(md.indexToName().get(0), ImmutableSet.of("customer_name")); assertEquals(ImmutableList.of("customer_name", "user_name", "password"), md.formParams());
assertEquals(md.indexToName().get(1), ImmutableSet.of("user_name")); assertEquals(Arrays.asList("customer_name"), md.indexToName().get(0));
assertEquals(md.indexToName().get(2), ImmutableSet.of("password")); assertEquals(Arrays.asList("user_name"), md.indexToName().get(1));
assertEquals(Arrays.asList("password"), md.indexToName().get(2));
} }


interface HeaderParams { interface HeaderParams {
Expand All @@ -237,7 +240,7 @@ interface HeaderParams {
@Test public void headerParamsParseIntoIndexToName() throws Exception { @Test public void headerParamsParseIntoIndexToName() throws Exception {
MethodMetadata md = contract.parseAndValidatateMetadata(HeaderParams.class.getDeclaredMethod("logout", String.class)); MethodMetadata md = contract.parseAndValidatateMetadata(HeaderParams.class.getDeclaredMethod("logout", String.class));


assertEquals(md.template().headers().get("Auth-Token"), ImmutableSet.of("{Auth-Token}")); assertEquals(Arrays.asList("{Auth-Token}"), md.template().headers().get("Auth-Token"));
assertEquals(md.indexToName().get(0), ImmutableSet.of("Auth-Token")); assertEquals(Arrays.asList("Auth-Token"), md.indexToName().get(0));
} }
} }
39 changes: 19 additions & 20 deletions core/src/test/java/feign/DefaultRetryerTest.java
Expand Up @@ -15,42 +15,41 @@
*/ */
package feign; package feign;


import org.testng.annotations.Test; import org.junit.Rule;

import org.junit.Test;
import org.junit.rules.ExpectedException;
import java.util.Date; import java.util.Date;

import feign.Retryer.Default; import feign.Retryer.Default;


import static org.testng.Assert.assertEquals; import static org.junit.Assert.assertEquals;


@Test
public class DefaultRetryerTest { public class DefaultRetryerTest {
@Rule public final ExpectedException thrown = ExpectedException.none();


@Test(expectedExceptions = RetryableException.class) @Test public void only5TriesAllowedAndExponentialBackoff() throws Exception {
public void only5TriesAllowedAndExponentialBackoff() throws Exception {
RetryableException e = new RetryableException(null, null, null); RetryableException e = new RetryableException(null, null, null);
Default retryer = new Retryer.Default(); Default retryer = new Retryer.Default();
assertEquals(retryer.attempt, 1); assertEquals(1, retryer.attempt);
assertEquals(retryer.sleptForMillis, 0); assertEquals(0, retryer.sleptForMillis);


retryer.continueOrPropagate(e); retryer.continueOrPropagate(e);
assertEquals(retryer.attempt, 2); assertEquals(2, retryer.attempt);
assertEquals(retryer.sleptForMillis, 150); assertEquals(150, retryer.sleptForMillis);


retryer.continueOrPropagate(e); retryer.continueOrPropagate(e);
assertEquals(retryer.attempt, 3); assertEquals(3, retryer.attempt);
assertEquals(retryer.sleptForMillis, 375); assertEquals(375, retryer.sleptForMillis);


retryer.continueOrPropagate(e); retryer.continueOrPropagate(e);
assertEquals(retryer.attempt, 4); assertEquals(4, retryer.attempt);
assertEquals(retryer.sleptForMillis, 712); assertEquals(712, retryer.sleptForMillis);


retryer.continueOrPropagate(e); retryer.continueOrPropagate(e);
assertEquals(retryer.attempt, 5); assertEquals(5, retryer.attempt);
assertEquals(retryer.sleptForMillis, 1218); assertEquals(1218, retryer.sleptForMillis);


thrown.expect(RetryableException.class);
retryer.continueOrPropagate(e); retryer.continueOrPropagate(e);
// fail
} }


@Test public void considersRetryAfterButNotMoreThanMaxPeriod() throws Exception { @Test public void considersRetryAfterButNotMoreThanMaxPeriod() throws Exception {
Expand All @@ -61,7 +60,7 @@ protected long currentTimeMillis() {
}; };


retryer.continueOrPropagate(new RetryableException(null, null, new Date(5000))); retryer.continueOrPropagate(new RetryableException(null, null, new Date(5000)));
assertEquals(retryer.attempt, 2); assertEquals(2, retryer.attempt);
assertEquals(retryer.sleptForMillis, 1000); assertEquals(1000, retryer.sleptForMillis);
} }
} }

0 comments on commit 0f3947a

Please sign in to comment.