diff --git a/gh-7270/pom.xml b/gh-7270/pom.xml new file mode 100644 index 0000000..ad6771f --- /dev/null +++ b/gh-7270/pom.xml @@ -0,0 +1,46 @@ + + + 4.0.0 + + com.example + spring-boot-test-feign-bug + 1.0 + + + org.springframework.boot + spring-boot-starter-parent + 1.4.1.RELEASE + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.cloud + spring-cloud-starter-feign + 1.2.1.RELEASE + + + org.springframework.boot + spring-boot-starter-test + test + + + + + 1.8 + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + \ No newline at end of file diff --git a/gh-7270/src/main/java/example/ExampleApplication.java b/gh-7270/src/main/java/example/ExampleApplication.java new file mode 100644 index 0000000..39b4ad3 --- /dev/null +++ b/gh-7270/src/main/java/example/ExampleApplication.java @@ -0,0 +1,24 @@ +package example; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.feign.EnableFeignClients; +import org.springframework.web.bind.annotation.*; + +@SpringBootApplication +@RestController +@EnableFeignClients +public class ExampleApplication { + + @Autowired RepositoryService service; + + public static void main(String[] args) { + SpringApplication.run(ExampleApplication.class, args); + } + + @GetMapping("/repo/{owner}/{repo}/desc") + public String description(@PathVariable String owner, @PathVariable String repo) { + return service.description(owner, repo); + } +} diff --git a/gh-7270/src/main/java/example/GitHub.java b/gh-7270/src/main/java/example/GitHub.java new file mode 100644 index 0000000..f53519b --- /dev/null +++ b/gh-7270/src/main/java/example/GitHub.java @@ -0,0 +1,12 @@ +package example; + +import org.springframework.cloud.netflix.feign.FeignClient; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@FeignClient(name = "github", url = "https://api.github.com") +public interface GitHub { + @RequestMapping(value = "/repos/{owner}/{repo}", method = RequestMethod.GET) + Repo getRepository(@PathVariable(name = "owner") String owner, @PathVariable(name = "repo") String repo); +} diff --git a/gh-7270/src/main/java/example/Owner.java b/gh-7270/src/main/java/example/Owner.java new file mode 100644 index 0000000..276df17 --- /dev/null +++ b/gh-7270/src/main/java/example/Owner.java @@ -0,0 +1,23 @@ +package example; + +public class Owner { + + public String login; + public Long id; + public String avatarUrl; + public String gravatarId; + public String url; + public String htmlUrl; + public String followersUrl; + public String followingUrl; + public String gistsUrl; + public String starredUrl; + public String subscriptionsUrl; + public String organizationsUrl; + public String reposUrl; + public String eventsUrl; + public String receivedEventsUrl; + public String type; + public Boolean siteAdmin; + +} diff --git a/gh-7270/src/main/java/example/Repo.java b/gh-7270/src/main/java/example/Repo.java new file mode 100644 index 0000000..d19d899 --- /dev/null +++ b/gh-7270/src/main/java/example/Repo.java @@ -0,0 +1,74 @@ +package example; + +public class Repo { + public Long id; + public String name; + public String fullName; + public Owner owner; + public Boolean _private; + public String htmlUrl; + public String description; + public Boolean fork; + public String url; + public String forksUrl; + public String keysUrl; + public String collaboratorsUrl; + public String teamsUrl; + public String hooksUrl; + public String issueEventsUrl; + public String eventsUrl; + public String assigneesUrl; + public String branchesUrl; + public String tagsUrl; + public String blobsUrl; + public String gitTagsUrl; + public String gitRefsUrl; + public String treesUrl; + public String statusesUrl; + public String languagesUrl; + public String stargazersUrl; + public String contributorsUrl; + public String subscribersUrl; + public String subscriptionUrl; + public String commitsUrl; + public String gitCommitsUrl; + public String commentsUrl; + public String issueCommentUrl; + public String contentsUrl; + public String compareUrl; + public String mergesUrl; + public String archiveUrl; + public String downloadsUrl; + public String issuesUrl; + public String pullsUrl; + public String milestonesUrl; + public String notificationsUrl; + public String labelsUrl; + public String releasesUrl; + public String deploymentsUrl; + public String createdAt; + public String updatedAt; + public String pushedAt; + public String gitUrl; + public String sshUrl; + public String cloneUrl; + public String svnUrl; + public String homepage; + public Long size; + public Long stargazersCount; + public Long watchersCount; + public String language; + public Boolean hasIssues; + public Boolean hasDownloads; + public Boolean hasWiki; + public Boolean hasPages; + public Long forksCount; + public Object mirrorUrl; + public Long openIssuesCount; + public Long forks; + public Long openIssues; + public Long watchers; + public String defaultBranch; + public Long networkCount; + public Long subscribersCount; +} diff --git a/gh-7270/src/main/java/example/RepositoryService.java b/gh-7270/src/main/java/example/RepositoryService.java new file mode 100644 index 0000000..e422ccc --- /dev/null +++ b/gh-7270/src/main/java/example/RepositoryService.java @@ -0,0 +1,13 @@ +package example; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class RepositoryService { + @Autowired GitHub gitHub; + + public String description(String owner, String repository) { + return gitHub.getRepository(owner, repository).description; + } +} diff --git a/gh-7270/src/test/java/example/ExampleApplicationTest.java b/gh-7270/src/test/java/example/ExampleApplicationTest.java new file mode 100644 index 0000000..96ca5ab --- /dev/null +++ b/gh-7270/src/test/java/example/ExampleApplicationTest.java @@ -0,0 +1,27 @@ +package example; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import static org.mockito.Mockito.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; + +@RunWith(SpringRunner.class) +@WebMvcTest +public class ExampleApplicationTest { + @MockBean RepositoryService repositoryService; + @Autowired MockMvc mockMvc; + + @Test + public void shouldReturnDescription() throws Exception { + final String expected = "expected description"; + when(repositoryService.description(anyString(), anyString())) + .thenReturn(expected); + mockMvc.perform(get("/repo/foo/bar/desc")).andExpect(content().string(expected)); + } +} diff --git a/gh-7270/src/test/resources/logback.xml b/gh-7270/src/test/resources/logback.xml new file mode 100644 index 0000000..1b185bb --- /dev/null +++ b/gh-7270/src/test/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file