Skip to content

Commit 0f3947a

Browse files
author
Adrian Cole
committed
Replace TestNG with JUnit + Rules
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.
1 parent 32c32e7 commit 0f3947a

32 files changed

Lines changed: 908 additions & 1080 deletions

core/build.gradle

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,10 @@ apply plugin: 'java'
22

33
sourceCompatibility = 1.6
44

5-
test {
6-
useTestNG()
7-
}
8-
95
dependencies {
106
testCompile 'com.google.guava:guava:14.0.1'
117
testCompile 'com.google.code.gson:gson:2.2.4'
128
testCompile 'com.fasterxml.jackson.core:jackson-databind:2.2.2'
13-
testCompile 'org.testng:testng:6.8.5'
14-
testCompile 'com.google.mockwebserver:mockwebserver:20130706'
9+
testCompile 'junit:junit:4.12'
10+
testCompile 'com.squareup.okhttp:mockwebserver:2.2.0'
1511
}

core/src/test/java/feign/DefaultContractTest.java

Lines changed: 67 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -16,28 +16,29 @@
1616
package feign;
1717

1818
import com.google.common.collect.ImmutableList;
19-
import com.google.common.collect.ImmutableSet;
2019
import com.google.gson.reflect.TypeToken;
21-
import org.testng.annotations.Test;
22-
23-
import javax.inject.Named;
2420
import java.net.URI;
21+
import java.util.Arrays;
2522
import java.util.List;
26-
27-
import static org.testng.Assert.assertEquals;
28-
import static org.testng.Assert.assertFalse;
29-
import static org.testng.Assert.assertNull;
30-
import static org.testng.Assert.assertTrue;
23+
import javax.inject.Named;
24+
import org.junit.Rule;
25+
import org.junit.Test;
26+
import org.junit.rules.ExpectedException;
3127

3228
import static feign.Util.UTF_8;
29+
import static org.junit.Assert.assertEquals;
30+
import static org.junit.Assert.assertFalse;
31+
import static org.junit.Assert.assertNull;
32+
import static org.junit.Assert.assertTrue;
3333

3434
/**
3535
* Tests interfaces defined per {@link Contract.Default} are interpreted into expected {@link feign
3636
* .RequestTemplate template}
3737
* instances.
3838
*/
39-
@Test
4039
public class DefaultContractTest {
40+
@Rule public final ExpectedException thrown = ExpectedException.none();
41+
4142
Contract.Default contract = new Contract.Default();
4243

4344
interface Methods {
@@ -51,14 +52,14 @@ interface Methods {
5152
}
5253

5354
@Test public void httpMethods() throws Exception {
54-
assertEquals(contract.parseAndValidatateMetadata(Methods.class.getDeclaredMethod("post")).template().method(),
55-
"POST");
56-
assertEquals(contract.parseAndValidatateMetadata(Methods.class.getDeclaredMethod("put")).template().method(),
57-
"PUT");
58-
assertEquals(contract.parseAndValidatateMetadata(Methods.class.getDeclaredMethod("get")).template().method(),
59-
"GET");
60-
assertEquals(contract.parseAndValidatateMetadata(Methods.class.getDeclaredMethod("delete")).template().method(),
61-
"DELETE");
55+
assertEquals("POST",
56+
contract.parseAndValidatateMetadata(Methods.class.getDeclaredMethod("post")).template().method());
57+
assertEquals("PUT",
58+
contract.parseAndValidatateMetadata(Methods.class.getDeclaredMethod("put")).template().method());
59+
assertEquals("GET",
60+
contract.parseAndValidatateMetadata(Methods.class.getDeclaredMethod("get")).template().method());
61+
assertEquals("DELETE",
62+
contract.parseAndValidatateMetadata(Methods.class.getDeclaredMethod("delete")).template().method());
6263
}
6364

6465
interface BodyParams {
@@ -78,9 +79,11 @@ interface BodyParams {
7879
}.getType());
7980
}
8081

81-
@Test(expectedExceptions = IllegalStateException.class, expectedExceptionsMessageRegExp = "Method has too many Body.*")
82-
public void tooManyBodies() throws Exception {
83-
contract.parseAndValidatateMetadata(BodyParams.class.getDeclaredMethod("tooMany", List.class, List.class));
82+
@Test public void tooManyBodies() throws Exception {
83+
thrown.expect(IllegalStateException.class);
84+
thrown.expectMessage("Method has too many Body");
85+
contract.parseAndValidatateMetadata(
86+
BodyParams.class.getDeclaredMethod("tooMany", List.class, List.class));
8487
}
8588

8689
interface CustomMethodAndURIParam {
@@ -90,13 +93,13 @@ interface CustomMethodAndURIParam {
9093
@Test public void requestLineOnlyRequiresMethod() throws Exception {
9194
MethodMetadata md = contract.parseAndValidatateMetadata(CustomMethodAndURIParam.class.getDeclaredMethod("patch",
9295
URI.class));
93-
assertEquals(md.template().method(), "PATCH");
94-
assertEquals(md.template().url(), "");
96+
assertEquals("PATCH", md.template().method());
97+
assertEquals("", md.template().url());
9598
assertTrue(md.template().queries().isEmpty());
9699
assertTrue(md.template().headers().isEmpty());
97100
assertNull(md.template().body());
98101
assertNull(md.template().bodyTemplate());
99-
assertEquals(md.urlIndex(), Integer.valueOf(0));
102+
assertEquals(Integer.valueOf(0), md.urlIndex());
100103
}
101104

102105
interface WithQueryParamsInPath {
@@ -114,38 +117,38 @@ interface WithQueryParamsInPath {
114117
@Test public void queryParamsInPathExtract() throws Exception {
115118
{
116119
MethodMetadata md = contract.parseAndValidatateMetadata(WithQueryParamsInPath.class.getDeclaredMethod("none"));
117-
assertEquals(md.template().url(), "/");
120+
assertEquals("/", md.template().url());
118121
assertTrue(md.template().queries().isEmpty());
119-
assertEquals(md.template().toString(), "GET / HTTP/1.1\n");
122+
assertEquals("GET / HTTP/1.1\n", md.template().toString());
120123
}
121124
{
122125
MethodMetadata md = contract.parseAndValidatateMetadata(WithQueryParamsInPath.class.getDeclaredMethod("one"));
123-
assertEquals(md.template().url(), "/");
124-
assertEquals(md.template().queries().get("Action"), ImmutableSet.of("GetUser"));
125-
assertEquals(md.template().toString(), "GET /?Action=GetUser HTTP/1.1\n");
126+
assertEquals("/", md.template().url());
127+
assertEquals(Arrays.asList("GetUser"), md.template().queries().get("Action"));
128+
assertEquals("GET /?Action=GetUser HTTP/1.1\n", md.template().toString());
126129
}
127130
{
128131
MethodMetadata md = contract.parseAndValidatateMetadata(WithQueryParamsInPath.class.getDeclaredMethod("two"));
129-
assertEquals(md.template().url(), "/");
130-
assertEquals(md.template().queries().get("Action"), ImmutableSet.of("GetUser"));
131-
assertEquals(md.template().queries().get("Version"), ImmutableSet.of("2010-05-08"));
132-
assertEquals(md.template().toString(), "GET /?Action=GetUser&Version=2010-05-08 HTTP/1.1\n");
132+
assertEquals("/", md.template().url());
133+
assertEquals(Arrays.asList("GetUser"), md.template().queries().get("Action"));
134+
assertEquals(Arrays.asList("2010-05-08"), md.template().queries().get("Version"));
135+
assertEquals("GET /?Action=GetUser&Version=2010-05-08 HTTP/1.1\n", md.template().toString());
133136
}
134137
{
135138
MethodMetadata md = contract.parseAndValidatateMetadata(WithQueryParamsInPath.class.getDeclaredMethod("three"));
136-
assertEquals(md.template().url(), "/");
137-
assertEquals(md.template().queries().get("Action"), ImmutableSet.of("GetUser"));
138-
assertEquals(md.template().queries().get("Version"), ImmutableSet.of("2010-05-08"));
139-
assertEquals(md.template().queries().get("limit"), ImmutableSet.of("1"));
140-
assertEquals(md.template().toString(), "GET /?Action=GetUser&Version=2010-05-08&limit=1 HTTP/1.1\n");
139+
assertEquals("/", md.template().url());
140+
assertEquals(Arrays.asList("GetUser"), md.template().queries().get("Action"));
141+
assertEquals(Arrays.asList("2010-05-08"), md.template().queries().get("Version"));
142+
assertEquals(Arrays.asList("1"), md.template().queries().get("limit"));
143+
assertEquals("GET /?Action=GetUser&Version=2010-05-08&limit=1 HTTP/1.1\n", md.template().toString());
141144
}
142145
{
143146
MethodMetadata md = contract.parseAndValidatateMetadata(WithQueryParamsInPath.class.getDeclaredMethod("empty"));
144-
assertEquals(md.template().url(), "/");
147+
assertEquals("/", md.template().url());
145148
assertTrue(md.template().queries().containsKey("flag"));
146-
assertEquals(md.template().queries().get("Action"), ImmutableSet.of("GetUser"));
147-
assertEquals(md.template().queries().get("Version"), ImmutableSet.of("2010-05-08"));
148-
assertEquals(md.template().toString(), "GET /?flag&Action=GetUser&Version=2010-05-08 HTTP/1.1\n");
149+
assertEquals(Arrays.asList("GetUser"), md.template().queries().get("Action"));
150+
assertEquals(Arrays.asList("2010-05-08"), md.template().queries().get("Version"));
151+
assertEquals("GET /?flag&Action=GetUser&Version=2010-05-08 HTTP/1.1\n", md.template().toString());
149152
}
150153
}
151154

@@ -156,17 +159,16 @@ interface BodyWithoutParameters {
156159
}
157160

158161
@Test public void bodyWithoutParameters() throws Exception {
159-
String expectedBody = "<v01:getAccountsListOfUser/>";
160162
MethodMetadata md = contract.parseAndValidatateMetadata(BodyWithoutParameters.class.getDeclaredMethod("post"));
161-
assertEquals(md.template().body(), expectedBody.getBytes(UTF_8));
163+
assertEquals("<v01:getAccountsListOfUser/>", new String(md.template().body(), UTF_8));
162164
assertFalse(md.template().bodyTemplate() != null);
163165
assertTrue(md.formParams().isEmpty());
164166
assertTrue(md.indexToName().isEmpty());
165167
}
166168

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

172174
interface WithURIParam {
@@ -176,15 +178,15 @@ interface WithURIParam {
176178
@Test public void methodCanHaveUriParam() throws Exception {
177179
MethodMetadata md = contract.parseAndValidatateMetadata(WithURIParam.class.getDeclaredMethod("uriParam", String.class,
178180
URI.class, String.class));
179-
assertEquals(md.urlIndex(), Integer.valueOf(1));
181+
assertEquals(Integer.valueOf(1), md.urlIndex());
180182
}
181183

182184
@Test public void pathParamsParseIntoIndexToName() throws Exception {
183185
MethodMetadata md = contract.parseAndValidatateMetadata(WithURIParam.class.getDeclaredMethod("uriParam", String.class,
184186
URI.class, String.class));
185-
assertEquals(md.template().url(), "/{1}/{2}");
186-
assertEquals(md.indexToName().get(0), ImmutableSet.of("1"));
187-
assertEquals(md.indexToName().get(2), ImmutableSet.of("2"));
187+
assertEquals("/{1}/{2}", md.template().url());
188+
assertEquals(Arrays.asList("1"), md.indexToName().get(0));
189+
assertEquals(Arrays.asList("2"), md.indexToName().get(2));
188190
}
189191

190192
interface WithPathAndQueryParams {
@@ -199,13 +201,13 @@ Response recordsByNameAndType(@Named("domainId") int id, @Named("name") String n
199201
assertNull(md.template().body());
200202
assertNull(md.template().bodyTemplate());
201203
assertTrue(md.template().headers().isEmpty());
202-
assertEquals(md.template().url(), "/domains/{domainId}/records");
203-
assertEquals(md.template().queries().get("name"), ImmutableSet.of("{name}"));
204-
assertEquals(md.template().queries().get("type"), ImmutableSet.of("{type}"));
205-
assertEquals(md.indexToName().get(0), ImmutableSet.of("domainId"));
206-
assertEquals(md.indexToName().get(1), ImmutableSet.of("name"));
207-
assertEquals(md.indexToName().get(2), ImmutableSet.of("type"));
208-
assertEquals(md.template().toString(), "GET /domains/{domainId}/records?name={name}&type={type} HTTP/1.1\n");
204+
assertEquals("/domains/{domainId}/records", md.template().url());
205+
assertEquals(Arrays.asList("{name}"), md.template().queries().get("name"));
206+
assertEquals(Arrays.asList("{type}"), md.template().queries().get("type"));
207+
assertEquals(Arrays.asList("domainId"), md.indexToName().get(0));
208+
assertEquals(Arrays.asList("name"), md.indexToName().get(1));
209+
assertEquals(Arrays.asList("type"), md.indexToName().get(2));
210+
assertEquals("GET /domains/{domainId}/records?name={name}&type={type} HTTP/1.1\n", md.template().toString());
209211
}
210212

211213
interface FormParams {
@@ -221,12 +223,13 @@ void login(
221223
String.class, String.class));
222224

223225
assertFalse(md.template().body() != null);
224-
assertEquals(md.template().bodyTemplate(),
225-
"%7B\"customer_name\": \"{customer_name}\", \"user_name\": \"{user_name}\", \"password\": \"{password}\"%7D");
226-
assertEquals(md.formParams(), ImmutableList.of("customer_name", "user_name", "password"));
227-
assertEquals(md.indexToName().get(0), ImmutableSet.of("customer_name"));
228-
assertEquals(md.indexToName().get(1), ImmutableSet.of("user_name"));
229-
assertEquals(md.indexToName().get(2), ImmutableSet.of("password"));
226+
assertEquals(
227+
"%7B\"customer_name\": \"{customer_name}\", \"user_name\": \"{user_name}\", \"password\": \"{password}\"%7D",
228+
md.template().bodyTemplate());
229+
assertEquals(ImmutableList.of("customer_name", "user_name", "password"), md.formParams());
230+
assertEquals(Arrays.asList("customer_name"), md.indexToName().get(0));
231+
assertEquals(Arrays.asList("user_name"), md.indexToName().get(1));
232+
assertEquals(Arrays.asList("password"), md.indexToName().get(2));
230233
}
231234

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

240-
assertEquals(md.template().headers().get("Auth-Token"), ImmutableSet.of("{Auth-Token}"));
241-
assertEquals(md.indexToName().get(0), ImmutableSet.of("Auth-Token"));
243+
assertEquals(Arrays.asList("{Auth-Token}"), md.template().headers().get("Auth-Token"));
244+
assertEquals(Arrays.asList("Auth-Token"), md.indexToName().get(0));
242245
}
243246
}

core/src/test/java/feign/DefaultRetryerTest.java

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,42 +15,41 @@
1515
*/
1616
package feign;
1717

18-
import org.testng.annotations.Test;
19-
18+
import org.junit.Rule;
19+
import org.junit.Test;
20+
import org.junit.rules.ExpectedException;
2021
import java.util.Date;
21-
2222
import feign.Retryer.Default;
2323

24-
import static org.testng.Assert.assertEquals;
24+
import static org.junit.Assert.assertEquals;
2525

26-
@Test
2726
public class DefaultRetryerTest {
27+
@Rule public final ExpectedException thrown = ExpectedException.none();
2828

29-
@Test(expectedExceptions = RetryableException.class)
30-
public void only5TriesAllowedAndExponentialBackoff() throws Exception {
29+
@Test public void only5TriesAllowedAndExponentialBackoff() throws Exception {
3130
RetryableException e = new RetryableException(null, null, null);
3231
Default retryer = new Retryer.Default();
33-
assertEquals(retryer.attempt, 1);
34-
assertEquals(retryer.sleptForMillis, 0);
32+
assertEquals(1, retryer.attempt);
33+
assertEquals(0, retryer.sleptForMillis);
3534

3635
retryer.continueOrPropagate(e);
37-
assertEquals(retryer.attempt, 2);
38-
assertEquals(retryer.sleptForMillis, 150);
36+
assertEquals(2, retryer.attempt);
37+
assertEquals(150, retryer.sleptForMillis);
3938

4039
retryer.continueOrPropagate(e);
41-
assertEquals(retryer.attempt, 3);
42-
assertEquals(retryer.sleptForMillis, 375);
40+
assertEquals(3, retryer.attempt);
41+
assertEquals(375, retryer.sleptForMillis);
4342

4443
retryer.continueOrPropagate(e);
45-
assertEquals(retryer.attempt, 4);
46-
assertEquals(retryer.sleptForMillis, 712);
44+
assertEquals(4, retryer.attempt);
45+
assertEquals(712, retryer.sleptForMillis);
4746

4847
retryer.continueOrPropagate(e);
49-
assertEquals(retryer.attempt, 5);
50-
assertEquals(retryer.sleptForMillis, 1218);
48+
assertEquals(5, retryer.attempt);
49+
assertEquals(1218, retryer.sleptForMillis);
5150

51+
thrown.expect(RetryableException.class);
5252
retryer.continueOrPropagate(e);
53-
// fail
5453
}
5554

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

6362
retryer.continueOrPropagate(new RetryableException(null, null, new Date(5000)));
64-
assertEquals(retryer.attempt, 2);
65-
assertEquals(retryer.sleptForMillis, 1000);
63+
assertEquals(2, retryer.attempt);
64+
assertEquals(1000, retryer.sleptForMillis);
6665
}
6766
}

0 commit comments

Comments
 (0)