java - 谷歌云功能集成测试与Spring Boot中的配置文件?
问题描述
我创建了一个实现谷歌云功能的spring boot项目。所以我想为谷歌云功能实现一个集成测试。我想使用我在 spring boot 项目中定义的 dev 配置文件运行集成测试。
下面是我的集成测试
@RunWith(JUnit4.class)
public class ExampleIT {
// Each function must be assigned a unique port to run on.
// Otherwise, tests can flake when 2+ functions run simultaneously.
// This is also specified in the `function-maven-plugin` config in `pom.xml`.
private static final int PORT = 8081;
// Root URL pointing to the locally hosted function
// The Functions Framework Maven plugin lets us run a function locally
private static final String BASE_URL = "http://localhost:" + PORT;
private static Process emulatorProcess = null;
private static HttpClient client = HttpClient.newHttpClient();
@BeforeClass
public static void setUp() throws IOException {
// Get the sample's base directory (the one containing a pom.xml file)
String baseDir = System.getProperty("user.dir");
// Emulate the function locally by running the Functions Framework Maven plugin
emulatorProcess = new ProcessBuilder()
.command("mvn", "function:run")
.directory(new File(baseDir))
.start();
}
@AfterClass
public static void tearDown() throws IOException {
// Display the output of the plugin process
InputStream stdoutStream = emulatorProcess.getInputStream();
ByteArrayOutputStream stdoutBytes = new ByteArrayOutputStream();
stdoutBytes.write(stdoutStream.readNBytes(stdoutStream.available()));
System.out.println(stdoutBytes.toString(StandardCharsets.UTF_8));
// Terminate the running Functions Framework Maven plugin process
if (emulatorProcess.isAlive()) {
emulatorProcess.destroy();
}
}
@Test
public void helloHttp_shouldRunWithFunctionsFramework() throws Throwable {
String functionUrl = BASE_URL + "/helloHttp";
HttpRequest getRequest = HttpRequest.newBuilder().uri(URI.create(functionUrl)).GET().build();
// The Functions Framework Maven plugin process takes time to start up
// Use resilience4j to retry the test HTTP request until the plugin responds
// See `retryOnResultPredicate` here: https://resilience4j.readme.io/docs/retry
RetryRegistry registry = RetryRegistry.of(RetryConfig.custom()
.maxAttempts(12)
.intervalFunction(IntervalFunction.ofExponentialBackoff(200, 2))
.retryExceptions(IOException.class)
.retryOnResult(body -> body.toString().length() == 0)
.build());
Retry retry = registry.retry("my");
// Perform the request-retry process
String body = Retry.decorateCheckedSupplier(retry, () -> client.send(
getRequest,
HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)).body()
).apply();
// Verify the function returned the right results
assertThat(body).isEqualTo("Hello world!");
}
}