多模块 spring 引导项目中的单元测试
Unit test in multi-module spring boot project
我有一个多模块项目,结构如下:
- 服务器(包括应用程序上下文配置)和其他配置
- 共享(实用程序 classes 被其他模块使用)
- 服务(具有各种存储库和服务的模块)
- 交易(处理交易的模块)
我需要为项目编写测试,但我无法更改项目结构。我在我的交易模块中创建了一个测试。
首先我得到了
Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test
我通过在测试文件夹中创建一个 @Configuration 文件解决了这个问题
@Configuration
@ComponentScan("com.mohen")
public class TestConfig {
}
然后我在 @SpringBootTest(TestConfig.class)
中使用它。我能够自动装配, IDE 没有显示任何错误迹象。但是当我 运行 我的测试时,我从另一个 class 试图从服务模块自动装配依赖项得到 NoSuchBeanDefinitionException。
如何解决这些问题?
应用程序的主要配置文件看起来像
@SpringBootApplication(scanBasePackages = "com.mohen")
@EnableScheduling
@EnableAsync
@Import(value = {SSIpFilter.class, MainConfig.class})
public class Application extends SpringBootServletInitializer {...}
MainConfig.class 包含 componentScan 和 Import 注释。
如果我尝试在我的测试中导入 MainConfig.class,我会得到一个建议,向服务器模块添加一个依赖项,我不想这样做。
此外,整个应用程序使用单个 属性 文件 (yml)。我应该在哪里保存我的 属性 测试文件?
编辑
我设法 运行 测试,一个 dataJpaTest 和一个集成测试,但它加载了整个应用程序上下文。
现在的问题是,正常通过的测试,在我构建项目时失败了 ./gradlew clean build
我明白了
java.lang.NoClassDefFoundError
在某些 class 和
中
Caused by: javassist.NotFoundException
其他
我试过添加 javaassist 库,但它不起作用。
有什么想法吗?
我找到了问题的解决方案。由于项目是多模块的,类 和包没有被其他模块识别。
我对模块的 build.gradle 文件进行了一些更改。
testRuntime project(':shared')
我在依赖中添加了上面的,还添加了
jar {
enabled = true
}
bootRepackage{
enabled = false
}
jar 创建一个简单的不可执行的 jar 文件,而 bootRepackage 禁止创建可执行的 jar 文件,默认情况下这是它的本性。
我有一个多模块项目,结构如下:
- 服务器(包括应用程序上下文配置)和其他配置
- 共享(实用程序 classes 被其他模块使用)
- 服务(具有各种存储库和服务的模块)
- 交易(处理交易的模块) 我需要为项目编写测试,但我无法更改项目结构。我在我的交易模块中创建了一个测试。
首先我得到了
Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test
我通过在测试文件夹中创建一个 @Configuration 文件解决了这个问题
@Configuration
@ComponentScan("com.mohen")
public class TestConfig {
}
然后我在 @SpringBootTest(TestConfig.class)
中使用它。我能够自动装配, IDE 没有显示任何错误迹象。但是当我 运行 我的测试时,我从另一个 class 试图从服务模块自动装配依赖项得到 NoSuchBeanDefinitionException。
如何解决这些问题?
应用程序的主要配置文件看起来像
@SpringBootApplication(scanBasePackages = "com.mohen")
@EnableScheduling
@EnableAsync
@Import(value = {SSIpFilter.class, MainConfig.class})
public class Application extends SpringBootServletInitializer {...}
MainConfig.class 包含 componentScan 和 Import 注释。
如果我尝试在我的测试中导入 MainConfig.class,我会得到一个建议,向服务器模块添加一个依赖项,我不想这样做。
此外,整个应用程序使用单个 属性 文件 (yml)。我应该在哪里保存我的 属性 测试文件?
编辑
我设法 运行 测试,一个 dataJpaTest 和一个集成测试,但它加载了整个应用程序上下文。
现在的问题是,正常通过的测试,在我构建项目时失败了 ./gradlew clean build
我明白了
java.lang.NoClassDefFoundError
在某些 class 和
中Caused by: javassist.NotFoundException
其他
我试过添加 javaassist 库,但它不起作用。
有什么想法吗?
我找到了问题的解决方案。由于项目是多模块的,类 和包没有被其他模块识别。 我对模块的 build.gradle 文件进行了一些更改。
testRuntime project(':shared')
我在依赖中添加了上面的,还添加了
jar {
enabled = true
}
bootRepackage{
enabled = false
}
jar 创建一个简单的不可执行的 jar 文件,而 bootRepackage 禁止创建可执行的 jar 文件,默认情况下这是它的本性。