ali*_*opi 35 java junit spring spring-test spring-boot
我究竟做错了什么?我正在使用这个小的独立应用程序运行并找到我的src/main/resources/config/application.yml
.相同的配置在JUnit中不起作用,见下文:
@Configuration
@ComponentScan
@EnableConfigurationProperties
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class);
}
}
@Component
@ConfigurationProperties
public class Bean{
...
}
Run Code Online (Sandbox Code Playgroud)
以下不起作用,application.yml
未加载相同的属性并且Bean
只有null
值:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestApplication.class)
public class SomeTestClass {
...
}
Run Code Online (Sandbox Code Playgroud)
lub*_*nac 36
试试这个:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestApplication.class,
initializers = ConfigFileApplicationContextInitializer.class)
public class SomeTestClass {
...
}
Run Code Online (Sandbox Code Playgroud)
编辑:
对于Spring Boot版本1.5+,SpringApplicationConfiguration
被删除以支持SpringBootTest
或直接使用SpringBootContextLoader
.
您仍然可以使用initializers
带ContextConfiguration
注释的参数.
使用在SpringBoot 2.0中加载任何自定义yml文件的技巧@SpringBootTest
ConfigFileApplicationContextInitializer
和spring.config.location
财产示例代码:
@RunWith(SpringRunner.class)
@ContextConfiguration(
classes = { MyConfiguration.class, AnotherDependancy.class },
initializers = {ConfigFileApplicationContextInitializer.class} )
@TestPropertySource(properties = { "spring.config.location=classpath:myApp-test.yml" })
public class ConfigProviderTest {
@Autowired
private MyConfiguration myConfiguration; //this will be filled with myApp-test.yml
@Value("${my.config-yml-string}")
private String someSrting; //will get value from the yml file.
}
Run Code Online (Sandbox Code Playgroud)
@TestPropertySource(locations = { "classpath:application.yaml" })
Run Code Online (Sandbox Code Playgroud)
application.yaml
这里的主要区别是,如果不在您的/test/resources
目录中,测试将失败并出现文件未找到异常
小智 8
这是另一种方式:[Spring Boot v1.4.x]
@Configuration
@ConfigurationProperties(prefix = "own")
public class OwnSettings {
private String name;
Getter & setters...
}
Run Code Online (Sandbox Code Playgroud)
import org.springframework.boot.test.context.SpringBootTestContextBootstrapper;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@BootstrapWith(SpringBootTestContextBootstrapper.class)
public class OwnSettingsTest {
@Autowired
private OwnSettings bean;
@Test
public void test() {
bean.getName();
}
}
Run Code Online (Sandbox Code Playgroud)
仅当"application.properties"文件存在时,此方法才有效.
例如maven项目:
src/main/resources/application.properties [ 该文件可以为空但它是必需的!]
src/main/resources/application.yml [这是你的真实配置文件]
2017年2月替代方案:
@SpringBootTest
@ContextConfiguration(classes = { TestApplication.class })
@RunWith(SpringRunner.class)
public class SomeTestClass {
...
}
Run Code Online (Sandbox Code Playgroud)
精益变体(没有@SpringBootTest
):
@ContextConfiguration(classes = { TestApplication.class },
initializers = { ConfigFileApplicationContextInitializer.class })
@RunWith(SpringRunner.class)
public class SomeTestClass {
Run Code Online (Sandbox Code Playgroud)
由于 spring-boot 2.6.0 版本org.springframework.boot.test.context.ConfigFileApplicationContextInitializer
已被弃用,建议使用org.springframework.boot.test.context.ConfigDataApplicationContextInitializer
。
在您的测试中,您可以将其用作:
@ContextConfiguration(classes = {
...
}, initializers = ConfigDataApplicationContextInitializer.class)
public class MyTestingClassIT
Run Code Online (Sandbox Code Playgroud)
使用 Spring Boot 2 进行单元测试
spring boot 2 默认支持“application.properties”,对于“application.yml”,只需在下面添加:
@TestPropertySource(properties = { "spring.config.location=classpath:application.yml" })
Run Code Online (Sandbox Code Playgroud)
例如
@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource(properties = { "spring.config.location=classpath:application.yml" })
public class ServiceTest {...}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
55492 次 |
最近记录: |