- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我尝试为我的单元测试加载第二个属性文件,这会覆盖一些属性。
在 @Configuration
上使用 @PropertySource
加载它不起作用,使用 @TestPropertySource
加载它也不起作用。只有直接在 @TesPropertySource
上设置 properties
才有效,但是当我尝试将其变成元注释时它不起作用。
这是一个示例项目:https://github.com/cptwunderlich/SpringTestProperties
我更愿意加载一个文件来影响所有测试(例如使用 @PropertySource
),但如果这不起作用,至少有一个自定义元注释会很好,所以我不必把它放在每一个 测试中。基本上我想不将一些数据导入到数据库中用于测试(spring.datasource.data),然后还更改使用的数据库 - 无需复制整个配置并且不必在每个位置更改它时间。
重要的部分:
@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource(locations = "classpath:application-test.properties")
public class TestconfigApplicationTests {
@Value("${my.test.property}")
private String testproperty;
@Test
public void assertValue() {
Assert.assertEquals("foobar", testproperty);
}
}
或者测试包中的配置类:
@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
@PropertySource("classpath:application-test.properties")
public class GlobalTestConfig {
}
更新:
答案中的主要建议是使用 @ActiveProfile
激活“测试”配置文件,这将导致加载“application-test.yaml”。这比 @TestPropertySource
好,但我仍然需要在每个测试类上添加注释。我尝试创建一个元注释 - should work - 所以至少我只有一个自定义注释,我可以在其中捆绑其他设置。但这不起作用。
完美的解决方案是使用一个配置类全局设置这些设置,而不必在每个测试上都添加注释。我仍在寻找该解决方案,或者至少在关闭此问题之前调试元注释。
编辑:我创建了一个 Jira 问题:SPR-17531
编辑
好吧,我有点困惑,所以我重新测试了所有不同的组合:
@TestPropertySource(locations = "classpath:application-test.properties")
在测试中,现在确实有效。嗯。@ActiveProfiles("test")
测试有效。@ActiveProfiles
的元注释不 起作用。编辑:确实...编辑:
好吧,我错了。元注释确实有效——我忘记设置保留策略,默认是 CLASS。添加 @Retention(RUNTIME)
可以解决这个问题。
似乎没有办法在代码中全局设置它(即,无需在我的 IDE 中配置测试的运行方式),所以我现在必须使用配置文件。
最佳答案
您可以使用@ActiveProfiles("test")
。这会将 application-test.yml
属性设置到测试环境中。
@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("test")
public class TestconfigApplicationTests {
...
}
如果我们需要针对不同的环境,Boot 中有一个内置机制,因此不需要额外的库或重构。
我们可以简单地在 src/main/resources
目录中定义一个 application-environment.properties
文件——然后设置一个具有相同环境名称的 Spring 配置文件。
例如,如果我们定义一个staging
或test
环境,这意味着我们必须定义一个staging 或test profile 然后是application-staging .properties
或 application-test.properties
。
此 env
文件将被加载,并将优先于默认属性文件 application.properties
。请注意,默认文件仍将被加载,只是当发生属性冲突时,环境特定属性文件优先,这意味着 application-staging.properties
或 application- 中指定的属性test.properties
将覆盖 application.properties
中的那些。
每个测试类都使用自己的配置文件,因此您需要为每个类指定 Activity 配置文件。
您可能感兴趣的另一件事是您可以通过配置
类模拟服务
@Configuration
@Profile("mockEntityService")
public class EntityServiceMockProvider {
@Bean
@Primary
public EntityService entityService() {
EntityService mockedEntityService = Mockito.mock(EntityService.class);
Entity entity= Mockito.mock(Entity.class);
when(mockedEntityService.save(any(Entity.class)))
.thenReturn(entity);
return mockedEntityService ;
}
}
在测试类中,您可以使用多个 Activity 配置文件:例如@ActiveProfiles({"test", "mockEntityService"})
因此,您将使用模拟实现,而不是使用 EntityService
的真实实现。
关于java - Spring 启动 : How to override default properties in Unit tests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53409635/
有没有在OpenJDK 1.7.0_45中派生类重写基类方法,但没有@Override注解,运行时派生类实例调用基类方法的情况? class Base { public f() { }
我正在尝试在 C++ 中练习 OOP,但我遇到了有关覆盖函数的问题。在我的 Shape2D 和 Shape3D 类中,我有在 Square 和 Sphere 类(分别为 ShowArea() 和 Sh
我想控制值在槽中的保存方式以及读取槽时返回的内容。这是我的类定义: (defclass object () ((name :accessor name-access :initf
我正在尝试在 C++ 中练习 OOP,但我遇到了有关覆盖函数的问题。在我的 Shape2D 和 Shape3D 类中,我有在 Square 和 Sphere 类(分别为 ShowArea() 和 Sh
我读了section在 Scala 编程中,引入了抽象重写,但我仍然对这些修饰符的连接到底意味着什么感到困惑。使用这些修饰符的代码片段粘贴在下面: trait Doubling extends Int
阅读Javadoc对于 @Override 注释,我遇到了以下规则: If a method is annotated with thisannotation type compilers are r
我正在基于 BEP20Token 模板 (https://github.com/binance-chain/bsc-genesis-contract/blob/master/contracts/bep
关于下面提到的 3 份契约(Contract): 1) Whenever hashCode() is invoked on the same object more than once during
在 C# 中,override 默认启用,那么,是否不需要显式在基类中将方法声明为可覆盖?如果是的话 Overridable 仅限于 VB.NET 还是在 C# 中也是必需的? 因此可以覆盖哪些类型的
以下代码在 public void onClick 行生成此错误消息。 Multiple markers at this line - implements android.view.View.OnC
当我在运行 IIS 的服务器 2012R2 上托管它时,我能够使用 Autorest 和我的 api 生成代码 但是,当我尝试使用 localhost url 运行它时,我收到一条无法读取的消息。 我
代码如下。 IDE 的代码没问题,但 gradle 拒绝构建,并表示: TextAdapter is not abstract and does not override abstract metho
这个问题已经有答案了: Best practice for overriding classes / properties in ExtJS? (3 个回答) 已关闭 8 年前。 这两个覆盖有什么区别
我今天将 xcode 更新为 7。更新后,我正在处理的项目出现警告“覆盖成员函数但未标记为‘覆盖’”。由于我们的项目将“踩踏警告为错误”设置为true。我遇到了很多错误。 我仔细检查了“Other L
我试图将 Apple 的 ARKit 示例应用程序集成到我的应用程序中。由于 ARKit 只是一个附加功能,所以我需要支持较低版本的 iOS。我在所有 ARKit 示例应用程序类中添加了 @avail
我覆盖了类的 Equals() 来比较 Guid 类型的 ID 值。 然后 Visual Studio 警告: ... overrides Object.Equals(object o) but do
我正在尝试用 Java 中的 Runnable 对象创建一个基本线程。下面是我的代码: import java.lang.Thread; import java.lang.Runnable; publ
我有一个函数: int function(int a, int b = 1, int c = 2){ return a+b+c; } 我想将“c”变量的值设置为3,但不想设置“b”的值 在像
我正在尝试了解GAS的.code16行为。 在手册中,对于16位部分,对于32位操作数或指令,似乎会为指令编码生成一个66H操作数替代前缀。这是否意味着 .code16 movw %eax, %ebx
我正在尝试创建一个 JFrame,向 JFrame 添加一个 JLabel(image),但这需要我抛出 IOException,这会弄乱我的 main 方法中的 run() 。 谁能告诉我如何抛出异
我是一名优秀的程序员,十分优秀!