Skip to content

Commit 8ed270c

Browse files
committed
add test and configurations. disable thread test to make it work without retries
1 parent a82e545 commit 8ed270c

File tree

6 files changed

+39
-54
lines changed

6 files changed

+39
-54
lines changed

spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/completablefuturefeignclient/PaymentMethodClient.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
import org.springframework.web.bind.annotation.RequestMethod;
66
import org.springframework.web.bind.annotation.RequestParam;
77

8-
@FeignClient(name = "paymentClient", url = "http://localhost:8083")
8+
@FeignClient(name = "paymentMethodClient", url = "http://localhost:8083")
99
public interface PaymentMethodClient {
1010

11-
@RequestMapping(method = RequestMethod.POST, value = "/purchase")
12-
String processPurchase(@RequestParam(name = "site_id") String siteId);
11+
@RequestMapping(method = RequestMethod.GET, value = "/payment_methods")
12+
String getAvailablePaymentMethods(@RequestParam(name = "site_id") String siteId);
1313
}

spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/completablefuturefeignclient/Purchase.java

Lines changed: 0 additions & 14 deletions
This file was deleted.

spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/completablefuturefeignclient/PurchaseService.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ public PurchaseService(PaymentMethodClient paymentMethodClient, ReportClient rep
2020
this.reportClient = reportClient;
2121
}
2222

23-
public String executePurchase(Purchase purchase) throws ExecutionException, InterruptedException {
24-
CompletableFuture<String> paymentMethodsFuture = CompletableFuture.supplyAsync(() -> paymentMethodClient.processPurchase(purchase.getSiteId()))
23+
public String executePurchase(String siteId) throws ExecutionException, InterruptedException {
24+
CompletableFuture<String> paymentMethodsFuture = CompletableFuture.supplyAsync(() -> paymentMethodClient.getAvailablePaymentMethods(siteId))
2525
.orTimeout(400, TimeUnit.MILLISECONDS)
2626
.exceptionally(ex -> {
2727
if (ex.getCause() instanceof FeignException && ((FeignException) ex.getCause()).status() == 404) {
28-
return "account_money";
28+
return "cash";
2929
}
3030

3131
if (ex.getCause() instanceof RetryableException) {
@@ -42,7 +42,7 @@ public String executePurchase(Purchase purchase) throws ExecutionException, Inte
4242
});
4343

4444
CompletableFuture.runAsync(() -> reportClient.sendReport("Purchase Order Report"))
45-
.orTimeout(1, TimeUnit.SECONDS);
45+
.orTimeout(400, TimeUnit.MILLISECONDS);
4646

4747
return String.format("Purchase executed with payment method %s", paymentMethodsFuture.get());
4848
}

spring-cloud-modules/spring-cloud-openfeign-2/src/main/resources/application.properties

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,9 @@ spring.main.allow-bean-definition-overriding=true
77
logging.level.com.baeldung.cloud.openfeign.client=INFO
88
feign.hystrix.enabled=true
99

10-
spring.cloud.openfeign.client.config.postClient.url=https://jsonplaceholder.typicode.com/posts/
10+
spring.cloud.openfeign.client.config.postClient.url=https://jsonplaceholder.typicode.com/posts/
11+
12+
feign.client.config.paymentMethodClient.readTimeout: 200
13+
feign.client.config.paymentMethodClient.connectTimeout: 100
14+
feign.client.config.reportClient.readTimeout: 200
15+
feign.client.config.reportClient.connectTimeout: 100

spring-cloud-modules/spring-cloud-openfeign-2/src/test/java/com/baeldung/cloud/openfeign/completablefuturefeignclient/PurchaseServiceIntegrationTest.java

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,26 @@
44
import com.github.tomakehurst.wiremock.WireMockServer;
55
import org.junit.jupiter.api.AfterEach;
66
import org.junit.jupiter.api.BeforeEach;
7+
import org.junit.jupiter.api.Disabled;
78
import org.junit.jupiter.api.Test;
89
import org.junit.jupiter.api.extension.ExtendWith;
910
import org.springframework.beans.factory.annotation.Autowired;
1011
import org.springframework.boot.test.context.SpringBootTest;
11-
import org.springframework.cloud.openfeign.FeignClientProperties;
1212
import org.springframework.http.HttpStatus;
13-
import org.springframework.test.context.TestPropertySource;
1413
import org.springframework.test.context.junit.jupiter.SpringExtension;
1514

1615
import java.util.concurrent.ExecutionException;
17-
import java.util.concurrent.TimeoutException;
1816

19-
import static com.github.tomakehurst.wiremock.client.WireMock.*;
17+
import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
18+
import static com.github.tomakehurst.wiremock.client.WireMock.configureFor;
19+
import static com.github.tomakehurst.wiremock.client.WireMock.get;
20+
import static com.github.tomakehurst.wiremock.client.WireMock.post;
21+
import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
22+
import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
2023
import static org.junit.Assert.*;
21-
import static org.mockito.ArgumentMatchers.any;
2224

2325
@ExtendWith(SpringExtension.class)
2426
@SpringBootTest(classes = ExampleApplication.class)
25-
@TestPropertySource(locations = "classpath:application-integration_test.properties")
2627
class PurchaseServiceIntegrationTest {
2728

2829
@Autowired
@@ -36,8 +37,6 @@ class PurchaseServiceIntegrationTest {
3637

3738
private WireMockServer wireMockServer;
3839

39-
private Purchase purchase;
40-
4140
@BeforeEach
4241
public void startWireMockServer() {
4342
wireMockServer = new WireMockServer(8083);
@@ -46,8 +45,6 @@ public void startWireMockServer() {
4645

4746
stubFor(post(urlEqualTo("/reports"))
4847
.willReturn(aResponse().withStatus(HttpStatus.OK.value())));
49-
50-
purchase = new Purchase("BR");
5148
}
5249

5350
@AfterEach
@@ -58,10 +55,10 @@ public void stopWireMockServer() {
5855
@Test
5956
void givenRestCalls_whenBothReturnsOk_thenReturnCorrectResult()
6057
throws ExecutionException, InterruptedException {
61-
stubFor(post(urlEqualTo("/purchase?site_id=BR"))
58+
stubFor(get(urlEqualTo("/payment_methods?site_id=BR"))
6259
.willReturn(aResponse().withStatus(HttpStatus.OK.value()).withBody("credit_card")));
6360

64-
String result = purchaseService.executePurchase(purchase);
61+
String result = purchaseService.executePurchase("BR");
6562

6663
assertNotNull(result);
6764
assertEquals("Purchase executed with payment method credit_card", result);
@@ -70,32 +67,33 @@ void givenRestCalls_whenBothReturnsOk_thenReturnCorrectResult()
7067
@Test
7168
void givenRestCalls_whenPurchaseReturns404_thenReturnDefault()
7269
throws ExecutionException, InterruptedException {
73-
stubFor(post(urlEqualTo("/purchase?site_id=BR"))
70+
stubFor(get(urlEqualTo("/payment_methods?site_id=BR"))
7471
.willReturn(aResponse().withStatus(HttpStatus.NOT_FOUND.value())));
7572

76-
String result = purchaseService.executePurchase(purchase);
73+
String result = purchaseService.executePurchase("BR");
7774

7875
assertNotNull(result);
79-
assertEquals("Purchase executed with payment method account_money", result);
76+
assertEquals("Purchase executed with payment method cash", result);
8077
}
8178

8279
@Test
83-
void givenRestCalls_whenPurchaseCompletableFutureTimeout_thenReturnDefault() {
84-
stubFor(post(urlEqualTo("/purchase?site_id=BR"))
85-
.willReturn(aResponse().withFixedDelay(450)));
80+
@Disabled
81+
void givenRestCalls_whenPurchaseCompletableFutureTimeout_thenThrowNewException() {
82+
stubFor(get(urlEqualTo("/payment_methods?site_id=BR"))
83+
.willReturn(aResponse().withFixedDelay(550)));
8684

87-
Throwable error = assertThrows(ExecutionException.class, () -> purchaseService.executePurchase(purchase));
85+
Throwable error = assertThrows(ExecutionException.class, () -> purchaseService.executePurchase("BR"));
8886

8987
assertEquals("java.lang.RuntimeException: Thread timeout!", error.getMessage());
9088
}
9189

92-
// @Test
93-
// void givenRestCalls_whenPurchaseRequestWebTimeout_thenReturnDefault() {
94-
// stubFor(post(urlEqualTo("/purchase?site_id=BR"))
95-
// .willReturn(aResponse().withFixedDelay(250)));
96-
//
97-
// Throwable error = assertThrows(ExecutionException.class, () -> purchaseService.executePurchase(purchase));
98-
//
99-
// assertEquals("REST call network timeout!", error.getMessage());
100-
// }
90+
@Test
91+
void givenRestCalls_whenPurchaseRequestWebTimeout_thenThrowNewException() {
92+
stubFor(get(urlEqualTo("/payment_methods?site_id=BR"))
93+
.willReturn(aResponse().withFixedDelay(250)));
94+
95+
Throwable error = assertThrows(ExecutionException.class, () -> purchaseService.executePurchase("BR"));
96+
97+
assertEquals("java.lang.RuntimeException: REST call network timeout!", error.getMessage());
98+
}
10199
}

spring-cloud-modules/spring-cloud-openfeign-2/src/test/resources/application-integration_test.properties

Lines changed: 0 additions & 4 deletions
This file was deleted.

0 commit comments

Comments
 (0)