繁体   English   中英

应用程序(src / main)运行时,类路径中的src / test / resources中的文件是?

[英]Are files in src/test/resources on classpath while application (src/main) is running?

新手在这里! 我在SO上发现了很多类似的问题,但没有一个给我一个明确的答案。

我为所有层编写了测试,包括我的spring-boot应用程序中的持久层。 为了测试持久层,我使用了H2数据库。 我使用@DataJpaTest注释并将schema.sql和data.sql脚本放到src / test / resources / db文件夹中以创建模式并使用data.sql中的数据填充它。 它工作正常,所有测试都通过使用该数据。

现在我要做的是用@SpringBootTest设置集成测试来测试整个应用程序 - 从上到下,从Web层到数据层。 我使用H2配置创建了application-test.properties,并使用@ActiveProfiles(“test”)注释了我的测试类,它运行正常。 当我运行这个测试类时,应用程序上下文会启动,H2也会启动,但当然,那里没有数据。 我想用来自src / test / resources / db的data.sql中的相同日期填充我的内存数据库。

我用这种方式修改了application-test.properties:spring.datasource.url = jdbc:h2:mem:testdb; INIT = RUNSCRIPT FROM'classpath:db / schema.sql'\\ n; RUNSCRIPT FROM'classpath:db / data.sql '我得到了org.h2.jdbc.JdbcSQLNonTransientException:IO例外:“java.io.FileNotFoundException:resource /db/schema.sql”异常。

我已经做了很多谷歌搜索,我发现更多的资源说src / main / resources和src / test / resources都在classpath上。 如果是这样,为什么我会得到这个例外?

此外,当我将这两个脚本放到src / main / resources / db时,它工作正常。 此外,当我运行持久层测试时,无论这些脚本是在src / main / resources / db还是src / test / resources / db中,它都能正常工作。 因此,它看起来像使用src / main / resources和src / test / resources位置作为类路径的测试环境,但环境仅使用src / main / resources作为类路径!? 这可能是真的吗?

我尝试过的一个可能的解决方案是它不能运行那些脚本(在测试之前删除INIT = RUNSCRIPT FROM'classpath:db / schema.sql'\\; RUNSCRIPT FROM'classpath:db / data.sql'来自.properties文件)以编程方式创建一些对象并将它们持久化到数据库然后编写测试,但我认为从脚本填充数据比在每个测试类中编写此代码更容易和更精简。

另一个可能的解决方案是将这些脚本从src / test / resources / db复制到src / main / resources / db,但这意味着我会有重复的数据,我讨厌这个。 此外,这意味着更难维护。

下一个可能的解决方案是将这些脚本放到src / main / resources / db中,因为正如我所说,无论这些脚本是在src / main / resources / db还是src / test / resources / db中,数据持久性测试都能正常工作。 但是,这些脚本与测试有关,所以我认为它们不属于应用程序的主要部分。

而且,如果我提供这些脚本的绝对路径,它工作正常,但这意味着我的团队成员必须修改它以适应他们的机器。 不是最佳解决方案。

所以,我的问题是:1。测试环境是否同时使用src / main / resources和src / test / resources位置作为classpath,但主环境仅使用src / main / resources作为classpath? 2.我如何解决这一挑战?

测试环境是否同时使用src/main/resourcessrc/test/resources位置作为classpath,但主环境仅使用src/main/resources作为classpath?

是。 是真的。 在Maven和Gradle test classpath继承自main而不是从main继承。 这意味着在测试执行期间可以使用src/main/javasrc/main/resources中的类和资源,但主代码库无法访问src/test/javasrc/test/resources 另请注意,测试类和资源不具有传递性,即它们在依赖项目中不可用。

我该如何解决这一挑战?

嗯,有很多解决方案:

  1. 将资源放在src/main (显然)
  2. 将两个地方所需的资源提取到一个单独的模块中并依赖它。
  3. 使用maven-resources-plugin从其他位置复制文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM