如何在 SAP Cloud SDK 中为自己的 OData 服务执行集成测试

How to execute integrationtests for own OData service in SAP Cloud SDK

我们目前在 Spring 引导应用程序中提供自己的 OData 服务,其中包含 SAP Cloud Platform Provisioning SDK,它是 SAP Cloud SDK 的一部分。我们正在各自的 Maven 模块中创建集成测试,但是当通过 Maven 执行它时,它失败并显示以下堆栈跟踪:

[http-nio-auto-1-exec-1] ERROR com.sap.cloud.sdk.service.prov.v2.rt.cdx.CDXRuntimeDelegate - Error initializing the service <service-name>
java.lang.IllegalArgumentException: URI is not hierarchical
        at java.io.File.<init>(File.java:418)
        at com.sap.cloud.sdk.service.prov.v2.rt.cdx.CDXRuntimeDelegate.getFilefromFileName(CDXRuntimeDelegate.java:410)
        at com.sap.cloud.sdk.service.prov.v2.rt.cdx.CDXRuntimeDelegate.getFileForService(CDXRuntimeDelegate.java:387)
        at com.sap.cloud.sdk.service.prov.v2.rt.cdx.CDXRuntimeDelegate.initialize(CDXRuntimeDelegate.java:252)
        at com.sap.cloud.sdk.service.prov.v2.rt.cdx.CDXRuntimeDelegate.getModelProvider(CDXRuntimeDelegate.java:204)
        at com.sap.gateway.core.api.provider.delegate.ProviderFactory.createModelProvider(ProviderFactory.java:202)
        at com.sap.gateway.core.api.provider.delegate.ProviderFactory.getEdmModelProvider(ProviderFactory.java:128)
        at com.sap.gateway.core.odata4sap.ServiceFactory.createService(ServiceFactory.java:135)

查看代码似乎与以下内容有关post:

Why is my URI not hierarchical?

在 SDK 中,OData EDMX 文件被作为文件读取,但是由于在 Maven 执行期间它位于一个单独的 JAR 文件(应用程序模块的)中,因此无法以这种方式访问​​它。相反,它需要作为一个流来读取,这反过来似乎需要一些重构。

作为解决方法,我将 EDMX 文件复制到集成测试模块的 src/test/resources/edmx。

我现在想知道我是否遗漏了什么,或者通常根据 SAP Cloud SDK 执行的集成测试的执行是否与配置框架不兼容?

虽然我不太熟悉您解释的用例,但我还是建议您查看 Maven documentation on additional resource folders。除了它自己的 /resources 文件夹。我认为相对路径应该是可以的。

作为 Alexander 已发布内容的替代方案,您还可以通过 Maven 自动复制文件,如以下代码片段所示:

            <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.6</version>
            <executions>
                <!-- Copying the edmx files to the integration-tests project -->
                <execution>
                    <id>copy-resources</id>
                    <phase>validate</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${basedir}/src/test/resources/edmx</outputDirectory>
                        <resources>
                            <resource>
                                <directory>${project.parent.basedir}/srv/src/main/resources/edmx</directory>
                                <filtering>true</filtering>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
                <execution>
                    <id>default-testResources</id>
                    <phase>process-test-resources</phase>
                    <goals>
                        <goal>testResources</goal>
                    </goals>
                </execution>
                <execution>
                    <id>default-resources</id>
                    <phase>process-resources</phase>
                    <goals>
                        <goal>resources</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>