스프링 부트 테스트에서 와이어모크 랜덤 포트로 속성 설정
저는 와이어모크를 사용하여 외부 서비스를 조롱하는 스프링 부트 테스트가 있습니다.병렬 빌드와의 충돌을 방지하기 위해 와이어모크에 고정 포트 번호를 설정하지 않고 동적 포트 구성에 의존하고 싶습니다.
프로그램은합니다.external.baseUrl) application.yml(src/test/syslog 파일)을 참조하십시오.하지만 저는 프로그래밍 방식으로 그것을 재정의할 방법을 찾지 못했습니다.저는 다음과 같은 것을 시도해 보았습니다.
WireMockServer wireMockServer = new WireMockServer();
wireMockServer.start();
WireMock mockClient = new WireMock("localhost", wireMockServer.port());
System.setProperty("external.baseUrl", "http://localhost:" + wireMockServer.port());
하지만 작동하지 않았고 application.yml의 값이 대신 사용되었습니다.제가 살펴본 다른 모든 솔루션은 정적 값(예: 일부 주석)으로 속성을 재정의하지만 테스트가 실행될 때까지 와이어모크 포트의 값을 알 수 없습니다.
명확화:
스프링 부트와 와이어모크는 모두 랜덤 포트에서 실행됩니다.괜찮습니다. 그리고 저는 두 포트의 값을 얻는 방법을 알고 있습니다.그러나 wiremock은 외부 서비스를 조롱하는 것으로 되어 있고 나는 내 애플리케이션에 어떻게 접속하는지 알려줘야 합니다.이 작업은 다음과 같이 수행할 작업은external.baseUrl소유물.테스트에서 설정하고자 하는 값은 당연히 와이어모크 포트 번호에 따라 다릅니다.제 문제는 스프링 부트 테스트에서 속성을 프로그래밍 방식으로 설정하는 방법입니다.
Spring Cloud Contract Wiremock 사용 고려
하여 JUNit JUNit을 지정할 수 있습니다.${wiremock.port}합니다.
또는 사용할 수 있습니다.WireMockRestServiceServer를 와이어모크에 RestTemplate테스트에서 URL을 재정의할 필요가 없습니다.
https://stackoverflow.com/a/48859553/309683 에 언급된 속성 이름(예:wiremock.port. version ) 입니다. 적어도 Spring Cloud Contract 버전 이후로2.1.2.RELEASE.
작업 예제
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.cloud.contract.wiremock.AutoConfigureWireMock;
import org.springframework.core.env.Environment;
import org.springframework.test.context.junit4.SpringRunner;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT;
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = RANDOM_PORT)
@AutoConfigureWireMock(port = 0)
public class PortServiceTest {
@Autowired
private Environment environment;
@Test
public void shouldPopulateEnvironmentWithWiremockPort() {
assertThat(environment.containsProperty("wiremock.server.port")).isTrue();
assertThat(environment.getProperty("wiremock.server.port")).matches("\\d+");
}
}
기타 WireMock 속성
에 외wiremock.server.port,@AutoConfigureWireMock는 다음과 같은 일부 다른 속성으로 환경을 채웁니다.
wiremock.server.https-portwiremock.server.stubs[]wiremock.server.files[]
그라들 의존성
Gradle 기반 프로젝트에서 Spring Cloud Contract WireMock을 사용하려면 프로젝트에 다음 종속성을 추가합니다.
testImplementation 'org.springframework.cloud:spring-cloud-contract-wiremock:${version}'
에서 사용application.yaml 파일
를 application.yaml다음과 같은 파일:
sample:
port: ${wiremock.server.port}
그리고 다음 콩을 정의합니다.
@Component
@ConfigurationProperties(prefix = "sample")
@Data
public class PortProperties {
private Integer port;
}
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class PortService {
private final PortProperties config;
public Integer getPort() {
return config.getPort();
}
}
은 확할수다니를 할 수 .sample.port포트로 됩니다.
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = RANDOM_PORT)
@AutoConfigureWireMock(port = 0)
public class PortServiceTest {
@Autowired
private Environment environment;
@Autowired
private PortService portService;
@Test
public void shouldReturnWireMockPort() {
assertThat(portService.getPort())
.isNotNull()
.isEqualTo(Integer.parseInt(environment.getProperty("wiremock.server.port")));
}
}
application.properties에서 속성 대체를 사용합니다.
external.baseUrl=http://exampleUrl:${wiremock.server.port}
이를 위해서는 다음이 필요합니다.wiremock.server.portSpringBoot 전에 설정할 속성테스트가 초기화됩니다. 이는 다음을 추가하여 달성할 수 있습니다.@AutoConfigureWireMock테스트 클래스에 대한 주석입니다.
애플리케이션이 생성되고 모든 콩이 이미 구성된 후에만 테스트가 실행되기 때문에 스프링 부트 통합 테스트에서 속성을 재정의할 방법을 찾을 수 없었습니다.
주위의 작업으로 나는 다음을 추가했습니다.@TestConfiguration응용 프로그램의 콩을 교체하는 테스트:
private static WireMockServer wireMockServer1 = getWireMockServer();
private static WireMockServer wireMockServer2 = getWireMockServer();
private static WireMockServer wireMockServer3 = getWireMockServer();
private static WireMockServer getWireMockServer() {
final WireMockServer wireMockServer = new WireMockServer(options().dynamicPort());
wireMockServer.start();
return wireMockServer;
}
@TestConfiguration
static class TestConfig {
@Bean
@Primary
public BeanUsingAProperty1 getBean1() {
BeanUsingAProperty myBean = new BeanUsingAProperty();
myBean.setPort(wireMockServer.port());
return myBean;
}
@Bean
@Primary
public BeanUsingAProperty2 getBean2() {
String baseUrl = "http://localhost:" + wireMockServer2.port();
return new BeanUsingAProperty2(baseUrl);
}
@Bean
@Primary
public BeanUsingAProperty3 getBean3() {
String baseUrl = "http://localhost:" + wireMockServer3.port() + "/request";
return new BeanUsingAProperty3(new RestTemplate(), baseUrl, "someOtherParameter");
}
}
이것은 효과적으로 대체되었습니다.BeanUsingAProperty테스트에 정의된 포트 번호를 사용하여 Wiremock에 대한 올바른 포트 번호를 지정합니다.
이 구성을 선택하려면 테스트 주석에 이 클래스를 추가해야 했습니다.
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = {
MySpringBootApplication.class, MyIntegrationTest.TestConfig.class })
저는 정적이지 않은 Wiremock API를 사용하는데, 이러한 외부 서비스가 여러 개 있기 때문에 각각 조롱을 받아야 하기 때문입니다.서로 다른 콩이 만들어지는 방식은 각각의 설계 방식에 따라 다르다는 점에 따라 다릅니다.
Spring Boot 앱을 시작할 때 속성을 프로그래밍 방식으로 변경하는 방법은 사용자 지정 값을 응용 프로그램 주 진입점에 전달하는 것입니다.String[]args. 이렇게 하면 시스템 속성, YML 또는 기타 구성 파일과 같은 다른 모든 수단을 재정의할 수 있습니다.
다음은 예입니다.
String[] args = new String[]{"--my.prop=foo"};
SpringApplication.run(Application.class, args);
Spring Boot 앱(테스트용)을 시작하는 정적 메서드 또는 사용자 지정 API를 원하는 값으로 쉽게 노출할 수 있습니다.
그리고 와이어모크 포트의 가치를 알게 되면 모든 것이 쉬워집니다.다음은 PaymentServiceContractTest.java의 예입니다.
추신: 가라테(위에서 사용하는 오픈 소스 테스트 예제)는 와이어모크의 새로운 대안입니다. 확인해 보세요;)
org.springframework.cloud:spring-cloud-contract-wiremock 종속성을 사용할 때 주석의 팬이라면 그냥 추가할 수 있습니다.@AutoConfigureWireMock(port = Options.DYNAMIC_PORT)
내 사용 사례(사용하지 않음)SpringBootTest주석을 단SpringJUnitConfig부동산wiremock.server.port…의 가치가 있는0.
대신 SpEL을 사용합니다.#{wireMockServer.port}올바르게 작동했습니다.
어떻게 읽습니까?external.baseUrl를 사용하는 .@Value이 달린 석이달속성, 할수있다니습린을 할 수 .ReflectionTestUtils모의 서버를 설정한 후 포트를 설정합니다.
ReflectionTestUtils.setField(yourTestClass, "youPort", wireMockServer.port());
Thanks to brauls, refereeing to his repo, how feign client to make a request using wiremock, Junit 5 for testing with a random port
Git url --> https://github.com/brauls/spring-feign-wiremock-example
Add below entry in pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-contract-wiremock</artifactId>
<version>${spring-cloud-contract-wiremock.version}</version>
</dependency>
Add below entry in application-test.yaml
client:
endpoint: http://localhost:${wiremock.server.port}/
Add below entry in all the junit classes
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles("test")
@AutoConfigureWireMock(port = 0)
Add below method to mock the api respons in your junit classes where ever needed
@BeforeEach
void setUp() throws IOException {
setupMockBooksResponse();
}
private String setupMockBooksResponse() throws IOException {
File mockResposeFile = ResourceUtils.getFile("classpath:" + "mocks/sample_stub.json");
String content = "convert file content it into xml\json";
ObjectMapper om = new ObjectMapper();
String jsonInString = om.writeValueAsString("yourpojocloass");
return stubFor(post("/api/v2/")
.withHeader("Content-Type", equalTo("application/json"))
.withHeader("Accept", equalTo("application/json"))
.withRequestBody(WireMock.equalToJson(jsonInString))
.willReturn(WireMock.aResponse()
.withStatus(HttpStatus.OK.value())
.withHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE)
.withBody(content))).toString();
}
언급URL : https://stackoverflow.com/questions/48707625/set-property-with-wiremock-random-port-in-spring-boot-test
'programing' 카테고리의 다른 글
| 마리아에서 UDF를 제약 조건으로 사용할 수 없습니다.DB (0) | 2023.06.23 |
|---|---|
| ASP.NET 사용자 지정 Validator 클라이언트 측 및 서버 측 유효성 검사가 시작되지 않음 (0) | 2023.06.23 |
| 조건부 연산자 권리가 연관성이 있는 이유는 무엇입니까? (0) | 2023.06.23 |
| 활동에서 원래 추가된 창이 누출되었습니다. (0) | 2023.06.23 |
| MongoDB 노드 드라이버가 인스턴스 풀을 생성하는 동안 오류가 발생하는 이유는 무엇입니까? (0) | 2023.06.03 |