diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/README.md b/spring-cloud-modules/spring-cloud-openfeign-2/README.md
new file mode 100644
index 0000000000..a369da96da
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-openfeign-2/README.md
@@ -0,0 +1,9 @@
+### Relevant Articles:
+
+- [Introduction to Spring Cloud OpenFeign](https://www.baeldung.com/spring-cloud-openfeign)
+- [Differences Between Netflix Feign and OpenFeign](https://www.baeldung.com/netflix-feign-vs-openfeign)
+- [File Upload With Open Feign](https://www.baeldung.com/java-feign-file-upload)
+- [Feign Logging Configuration](https://www.baeldung.com/java-feign-logging)
+- [Provide an OAuth2 Token to a Feign Client](https://www.baeldung.com/spring-cloud-feign-oauth-token)
+- [Retrieve Original Message From Feign ErrorDecoder](https://www.baeldung.com/feign-retrieve-original-message)
+- [RequestLine with Feign Client](https://www.baeldung.com/feign-requestline)
diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/pom.xml b/spring-cloud-modules/spring-cloud-openfeign-2/pom.xml
new file mode 100644
index 0000000000..1e968e5d00
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-openfeign-2/pom.xml
@@ -0,0 +1,71 @@
+
+
+ 4.0.0
+ com.baeldung.cloud
+ spring-cloud-openfeign-2
+ spring-cloud-openfeign-2
+ OpenFeign project for Spring Boot
+
+
+ com.baeldung
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../../parent-boot-2
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring-cloud.version}
+ pom
+ import
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-openfeign
+
+
+ io.github.openfeign
+ feign-okhttp
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ io.github.openfeign.form
+ feign-form
+ 3.8.0
+
+
+ io.github.openfeign.form
+ feign-form-spring
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+ org.springframework.security
+ spring-security-oauth2-client
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+ 2021.0.0
+
+
+
\ No newline at end of file
diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/ExampleApplication.java b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/ExampleApplication.java
new file mode 100644
index 0000000000..c7f07f6667
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/ExampleApplication.java
@@ -0,0 +1,16 @@
+package com.baeldung.cloud.openfeign;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+
+@SpringBootApplication
+@EnableFeignClients
+public class ExampleApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ExampleApplication.class, args);
+ }
+
+}
+
diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/config/ClientConfiguration.java b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/config/ClientConfiguration.java
new file mode 100644
index 0000000000..801bd6c729
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/config/ClientConfiguration.java
@@ -0,0 +1,21 @@
+package com.baeldung.cloud.openfeign.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import feign.Logger;
+import feign.codec.ErrorDecoder;
+
+@Configuration
+public class ClientConfiguration {
+
+ @Bean
+ public Logger.Level feignLoggerLevel() {
+ return Logger.Level.FULL;
+ }
+
+ @Bean
+ public ErrorDecoder errorDecoder() {
+ return new ErrorDecoder.Default();
+ }
+}
diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/exception/BadRequestException.java b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/exception/BadRequestException.java
new file mode 100644
index 0000000000..7c2daf43fe
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/exception/BadRequestException.java
@@ -0,0 +1,21 @@
+package com.baeldung.cloud.openfeign.exception;
+
+public class BadRequestException extends Exception {
+
+ public BadRequestException() {
+ }
+
+ public BadRequestException(String message) {
+ super(message);
+ }
+
+ public BadRequestException(Throwable cause) {
+ super(cause);
+ }
+
+ @Override
+ public String toString() {
+ return "BadRequestException: " + getMessage();
+ }
+
+}
diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/exception/NotFoundException.java b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/exception/NotFoundException.java
new file mode 100644
index 0000000000..19f6204b86
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/exception/NotFoundException.java
@@ -0,0 +1,18 @@
+package com.baeldung.cloud.openfeign.exception;
+
+public class NotFoundException extends Exception {
+
+ public NotFoundException(String message) {
+ super(message);
+ }
+
+ public NotFoundException(Throwable cause) {
+ super(cause);
+ }
+
+ @Override
+ public String toString() {
+ return "NotFoundException: " + getMessage();
+ }
+
+}
diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/ExceptionMessage.java b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/ExceptionMessage.java
new file mode 100644
index 0000000000..45a555b2ea
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/ExceptionMessage.java
@@ -0,0 +1,55 @@
+package com.baeldung.cloud.openfeign.fileupload.config;
+
+public class ExceptionMessage {
+ private String timestamp;
+ private int status;
+ private String error;
+ private String message;
+ private String path;
+
+ public String getTimestamp() {
+ return timestamp;
+ }
+
+ public void setTimestamp(String timestamp) {
+ this.timestamp = timestamp;
+ }
+
+ public int getStatus() {
+ return status;
+ }
+
+ public void setStatus(int status) {
+ this.status = status;
+ }
+
+ public String getError() {
+ return error;
+ }
+
+ public void setError(String error) {
+ this.error = error;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public String getPath() {
+ return path;
+ }
+
+ public void setPath(String path) {
+ this.path = path;
+ }
+
+ @Override
+ public String toString() {
+ return "ExceptionMessage [timestamp=" + timestamp + ", status=" + status + ", error=" + error + ", message=" + message + ", path=" + path + "]";
+ }
+
+}
diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/FeignSupportConfig.java b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/FeignSupportConfig.java
new file mode 100644
index 0000000000..802077a3d7
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/FeignSupportConfig.java
@@ -0,0 +1,28 @@
+package com.baeldung.cloud.openfeign.fileupload.config;
+
+import org.springframework.beans.factory.ObjectFactory;
+import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
+import org.springframework.cloud.openfeign.support.SpringEncoder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.web.client.RestTemplate;
+
+import feign.codec.Encoder;
+import feign.codec.ErrorDecoder;
+import feign.form.spring.SpringFormEncoder;
+
+public class FeignSupportConfig {
+ @Bean
+ public Encoder multipartFormEncoder() {
+ return new SpringFormEncoder(new SpringEncoder(new ObjectFactory() {
+ @Override
+ public HttpMessageConverters getObject() {
+ return new HttpMessageConverters(new RestTemplate().getMessageConverters());
+ }
+ }));
+ }
+
+ @Bean
+ public ErrorDecoder errorDecoder() {
+ return new RetreiveMessageErrorDecoder();
+ }
+}
diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/RetreiveMessageErrorDecoder.java b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/RetreiveMessageErrorDecoder.java
new file mode 100644
index 0000000000..09bf8bf54b
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/RetreiveMessageErrorDecoder.java
@@ -0,0 +1,35 @@
+package com.baeldung.cloud.openfeign.fileupload.config;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import com.baeldung.cloud.openfeign.exception.BadRequestException;
+import com.baeldung.cloud.openfeign.exception.NotFoundException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import feign.Response;
+import feign.codec.ErrorDecoder;
+
+public class RetreiveMessageErrorDecoder implements ErrorDecoder {
+ private final ErrorDecoder errorDecoder = new Default();
+
+ @Override
+ public Exception decode(String methodKey, Response response) {
+ ExceptionMessage message = null;
+ try (InputStream bodyIs = response.body()
+ .asInputStream()) {
+ ObjectMapper mapper = new ObjectMapper();
+ message = mapper.readValue(bodyIs, ExceptionMessage.class);
+ } catch (IOException e) {
+ return new Exception(e.getMessage());
+ }
+ switch (response.status()) {
+ case 400:
+ return new BadRequestException(message.getMessage() != null ? message.getMessage() : "Bad Request");
+ case 404:
+ return new NotFoundException(message.getMessage() != null ? message.getMessage() : "Not found");
+ default:
+ return errorDecoder.decode(methodKey, response);
+ }
+ }
+}
diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/controller/FileController.java b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/controller/FileController.java
new file mode 100644
index 0000000000..102f9825e0
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/controller/FileController.java
@@ -0,0 +1,34 @@
+package com.baeldung.cloud.openfeign.fileupload.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.baeldung.cloud.openfeign.exception.NotFoundException;
+import com.baeldung.cloud.openfeign.fileupload.service.UploadService;
+
+@RestController
+public class FileController {
+
+ @Autowired
+ private UploadService service;
+
+ @PostMapping(value = "/upload")
+ public String handleFileUpload(@RequestPart(value = "file") MultipartFile file) {
+ return service.uploadFile(file);
+ }
+
+ @PostMapping(value = "/upload-mannual-client")
+ public boolean handleFileUploadWithManualClient(
+ @RequestPart(value = "file") MultipartFile file) {
+ return service.uploadFileWithManualClient(file);
+ }
+
+ @PostMapping(value = "/upload-error")
+ public String handleFileUploadError(@RequestPart(value = "file") MultipartFile file) throws NotFoundException {
+ return service.uploadFileWithCause(file);
+ }
+
+}
\ No newline at end of file
diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/FileUploadClient.java b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/FileUploadClient.java
new file mode 100644
index 0000000000..f7f54138de
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/FileUploadClient.java
@@ -0,0 +1,15 @@
+package com.baeldung.cloud.openfeign.fileupload.service;
+
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.baeldung.cloud.openfeign.fileupload.config.FeignSupportConfig;
+
+@FeignClient(name = "file", url = "http://localhost:8081", configuration = FeignSupportConfig.class, fallbackFactory = FileUploadClientFallbackFactory.class)
+public interface FileUploadClient {
+ @PostMapping(value = "/upload-file", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+ String fileUpload(@RequestPart(value = "file") MultipartFile file);
+}
diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/FileUploadClientFallbackFactory.java b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/FileUploadClientFallbackFactory.java
new file mode 100644
index 0000000000..2ccb2709a0
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/FileUploadClientFallbackFactory.java
@@ -0,0 +1,30 @@
+package com.baeldung.cloud.openfeign.fileupload.service;
+
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.baeldung.cloud.openfeign.exception.BadRequestException;
+import com.baeldung.cloud.openfeign.exception.NotFoundException;
+
+@Component
+public class FileUploadClientFallbackFactory implements FallbackFactory {
+ @Override
+ public FileUploadClient create(Throwable cause) {
+ return new FileUploadClient() {
+ @Override
+ public String fileUpload(MultipartFile file) {
+ if (cause instanceof BadRequestException) {
+ return "Bad Request!!!";
+ }
+ if (cause instanceof NotFoundException) {
+ return "Not Found!!!";
+ }
+ if (cause instanceof Exception) {
+ return "Exception!!!";
+ }
+ return "Successfully Uploaded file!!!";
+ }
+ };
+ }
+}
\ No newline at end of file
diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadClient.java b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadClient.java
new file mode 100644
index 0000000000..8f3ef7e421
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadClient.java
@@ -0,0 +1,18 @@
+package com.baeldung.cloud.openfeign.fileupload.service;
+
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.baeldung.cloud.openfeign.fileupload.config.FeignSupportConfig;
+
+@FeignClient(name = "file", url = "http://localhost:8081", configuration = FeignSupportConfig.class)
+public interface UploadClient {
+ @PostMapping(value = "/upload-file", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+ String fileUpload(@RequestPart(value = "file") MultipartFile file);
+
+ @PostMapping(value = "/upload-file-error", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+ String fileUploadError(@RequestPart(value = "file") MultipartFile file);
+}
diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadResource.java b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadResource.java
new file mode 100644
index 0000000000..26e658a7f0
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadResource.java
@@ -0,0 +1,16 @@
+package com.baeldung.cloud.openfeign.fileupload.service;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import feign.Headers;
+import feign.Param;
+import feign.RequestLine;
+import feign.Response;
+
+public interface UploadResource {
+
+ @RequestLine("POST /upload-file")
+ @Headers("Content-Type: multipart/form-data")
+ Response uploadFile(@Param("file") MultipartFile file);
+
+}
\ No newline at end of file
diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadService.java b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadService.java
new file mode 100644
index 0000000000..8a91607562
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadService.java
@@ -0,0 +1,36 @@
+package com.baeldung.cloud.openfeign.fileupload.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.baeldung.cloud.openfeign.exception.NotFoundException;
+
+import feign.Feign;
+import feign.Response;
+import feign.form.spring.SpringFormEncoder;
+
+@Service
+public class UploadService {
+ private static final String HTTP_FILE_UPLOAD_URL = "http://localhost:8081";
+
+ @Autowired
+ private UploadClient client;
+ @Autowired
+ private FileUploadClient fileUploadClient;
+
+ public boolean uploadFileWithManualClient(MultipartFile file) {
+ UploadResource fileUploadResource = Feign.builder().encoder(new SpringFormEncoder())
+ .target(UploadResource.class, HTTP_FILE_UPLOAD_URL);
+ Response response = fileUploadResource.uploadFile(file);
+ return response.status() == 200;
+ }
+
+ public String uploadFile(MultipartFile file) {
+ return client.fileUpload(file);
+ }
+
+ public String uploadFileWithCause(MultipartFile file) throws NotFoundException {
+ return fileUploadClient.fileUpload(file);
+ }
+}
\ No newline at end of file
diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/resources/application.properties
new file mode 100644
index 0000000000..7188b74c9b
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/resources/application.properties
@@ -0,0 +1,10 @@
+server.port=8085
+spring.main.allow-bean-definition-overriding=true
+spring.application.name= openfeign
+logging.level.com.baeldung.cloud.openfeign.client: DEBUG
+feign.hystrix.enabled=true
+
+spring.security.oauth2.client.registration.keycloak.authorization-grant-type=client_credentials
+spring.security.oauth2.client.registration.keycloak.client-id=payment-app
+spring.security.oauth2.client.registration.keycloak.client-secret=863e9de4-33d4-4471-b35e-f8d2434385bb
+spring.security.oauth2.client.provider.keycloak.token-uri=http://localhost:8083/auth/realms/master/protocol/openid-connect/token
diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/resources/fileupload.txt b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/resources/fileupload.txt
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/test/java/com/baeldung/cloud/openfeign/OpenFeignFileUploadLiveTest.java b/spring-cloud-modules/spring-cloud-openfeign-2/src/test/java/com/baeldung/cloud/openfeign/OpenFeignFileUploadLiveTest.java
new file mode 100644
index 0000000000..f558e07491
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-openfeign-2/src/test/java/com/baeldung/cloud/openfeign/OpenFeignFileUploadLiveTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.cloud.openfeign;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+
+import org.apache.commons.io.IOUtils;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.mock.web.MockMultipartFile;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.baeldung.cloud.openfeign.fileupload.service.UploadService;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class OpenFeignFileUploadLiveTest {
+
+ @Autowired
+ private UploadService uploadService;
+
+ private static String FILE_NAME = "fileupload.txt";
+
+ @Test
+ public void whenFeignBuilder_thenFileUploadSuccess() throws IOException {
+ ClassLoader classloader = Thread.currentThread().getContextClassLoader();
+ File file = new File(classloader.getResource(FILE_NAME).getFile());
+ Assert.assertTrue(file.exists());
+ FileInputStream input = new FileInputStream(file);
+ MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain",
+ IOUtils.toByteArray(input));
+ Assert.assertTrue(uploadService.uploadFileWithManualClient(multipartFile));
+ }
+
+ @Test
+ public void whenAnnotatedFeignClient_thenFileUploadSuccess() throws IOException {
+ ClassLoader classloader = Thread.currentThread().getContextClassLoader();
+ File file = new File(classloader.getResource(FILE_NAME).getFile());
+ Assert.assertTrue(file.exists());
+ FileInputStream input = new FileInputStream(file);
+ MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain",
+ IOUtils.toByteArray(input));
+ String uploadFile = uploadService.uploadFile(multipartFile);
+ Assert.assertNotNull(uploadFile);
+ }
+}
diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/test/java/com/baeldung/cloud/openfeign/SpringContextTest.java b/spring-cloud-modules/spring-cloud-openfeign-2/src/test/java/com/baeldung/cloud/openfeign/SpringContextTest.java
new file mode 100644
index 0000000000..4bf35f74f4
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-openfeign-2/src/test/java/com/baeldung/cloud/openfeign/SpringContextTest.java
@@ -0,0 +1,16 @@
+package com.baeldung.cloud.openfeign;
+
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = ExampleApplication.class)
+public class SpringContextTest {
+
+ @Test
+ public void whenSpringContextIsBootstrapped_thenNoExceptions() {
+ }
+}