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..56388ff9f4 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); @@ -117,9 +123,10 @@ public class ResourcesFileSource implements FileSource { return resource.getBinaryFileNamed(name); } } - } - catch (IOException e) { - // Ignore + } catch (RuntimeException e) { + // Ignore - find next stub file + } catch (IOException e) { + // 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..911b03f0a4 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,15 +16,25 @@ package org.springframework.cloud.contract.wiremock.file; +import com.github.tomakehurst.wiremock.common.BinaryFile; +import com.github.tomakehurst.wiremock.common.ClasspathFileSource; import com.github.tomakehurst.wiremock.common.FileSource; +import java.io.File; +import java.net.URI; +import java.net.URISyntaxException; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import static org.assertj.core.api.Assertions.assertThat; +@ExtendWith(MockitoExtension.class) class ResourcesFileSourceTest { @DisplayName("find all files in the multiple files directories.") @@ -57,4 +67,24 @@ 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