diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/file/ResourcesFileSource.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/file/ResourcesFileSource.java index 379cbf076c..ef4a0a2fb7 100644 --- a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/file/ResourcesFileSource.java +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/file/ResourcesFileSource.java @@ -48,7 +48,7 @@ public class ResourcesFileSource implements FileSource { this(toSources(resources)); } - private ResourcesFileSource(FileSource... sources) { + protected ResourcesFileSource(FileSource... sources) { this.sources = sources; } @@ -110,6 +110,12 @@ public class ResourcesFileSource implements FileSource { public BinaryFile getBinaryFileNamed(String name) { for (FileSource resource : this.sources) { try { + if (resource instanceof ClasspathFileSource) { + ClasspathFileSource classpathFileSource = (ClasspathFileSource) resource; + if (classpathFileSource.exists() && compressedResource(classpathFileSource.getUri())) { + return classpathFileSource.getBinaryFileNamed(name); + } + } UrlResource uri = new UrlResource(resource.getUri()); if (uri.exists()) { Resource relativeResource = new UrlResource(uri.getURI() + "/" + name); @@ -118,8 +124,11 @@ public class ResourcesFileSource implements FileSource { } } } + catch (RuntimeException e) { + // Ignore - find next stub file + } catch (IOException e) { - // Ignore + // Ignore - find next stub file } } throw new IllegalStateException("Cannot create file for " + name); diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/file/ResourcesFileSourceTest.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/file/ResourcesFileSourceTest.java index a83c5e6707..8b9c063802 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/file/ResourcesFileSourceTest.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/file/ResourcesFileSourceTest.java @@ -16,6 +16,12 @@ package org.springframework.cloud.contract.wiremock.file; +import java.io.File; +import java.net.URI; +import java.net.URISyntaxException; + +import com.github.tomakehurst.wiremock.common.BinaryFile; +import com.github.tomakehurst.wiremock.common.ClasspathFileSource; import com.github.tomakehurst.wiremock.common.FileSource; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -24,6 +30,8 @@ import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; class ResourcesFileSourceTest { @@ -57,4 +65,25 @@ class ResourcesFileSourceTest { assertThat(resourcesFileSource.getBinaryFileNamed("response-noticeList-success.json").getStream()).isNotEmpty(); } + @DisplayName("find a stub file in jar") + @Test + void find_stub_file_in_jar() throws URISyntaxException { + + // given + ClassLoader classLoader = getClass().getClassLoader(); + File file = new File(classLoader.getResource("jarfiles/module-banner-test-fixtures.jar").getFile()); + + String bannerStubPathInJar = "jar:file:" + file.getAbsolutePath() + "!/wiremock/banner/__files"; + String bannerStubFilename = "response-bannerList-success.json"; + ClasspathFileSource classpathFileSource1 = mock(ClasspathFileSource.class); + when(classpathFileSource1.getUri()).thenReturn(new URI(bannerStubPathInJar)); + when(classpathFileSource1.exists()).thenReturn(true); + when(classpathFileSource1.getBinaryFileNamed(bannerStubFilename)) + .thenReturn(new BinaryFile(new URI(bannerStubPathInJar + "/response-bannerList-success.json"))); + ResourcesFileSource resourcesFileSource = new ResourcesFileSource(classpathFileSource1); + + // when & then + assertThat(resourcesFileSource.getBinaryFileNamed(bannerStubFilename).getStream()).isNotEmpty(); + } + } diff --git a/spring-cloud-contract-wiremock/src/test/resources/jarfiles/module-banner-test-fixtures.jar b/spring-cloud-contract-wiremock/src/test/resources/jarfiles/module-banner-test-fixtures.jar new file mode 100644 index 0000000000..95a8bedd0a Binary files /dev/null and b/spring-cloud-contract-wiremock/src/test/resources/jarfiles/module-banner-test-fixtures.jar differ