解决您的问题的一个解决方案是初始化 Spring 上下文并自己执行属性查找,如我最初的评论和说明该概念的 referencing to a sample 所示。
现在的问题是,如果您不小心,您最终可能会初始化 Spring 上下文两次,一次使用静态定义,一次使用常规 Spring 测试设置。
幸运的是,Spring 本身带有一个AbstractJUnit4SpringContextTests 支持类,允许您重用已加载的 Spring ApplicationContext。
我们现在可以利用此功能来初始化假 SFTP 服务器,但也允许将 bean 注入测试代码,而无需通过 context.getBean(...) 调用手动查找。
下面的代码应该让您了解如何做到这一点:
@ContextConfiguration(classes = SpringTest.Config.class)
public class SpringTest extends AbstractJUnit4SpringContextTests {
@Configuration
@PropertySource("classpath:some.properties")
static class Config {
@Bean(name = "namedBean")
String someBean() {
return "Test";
}
@Bean
UUID uuidGenerator() {
return UUID.randomUUID();
}
}
static ApplicationContext context;
static int port;
static String user;
static String pass;
static {
context = new AnnotationConfigApplicationContext(SpringTest.Config.class);
Environment env = context.getBean(Environment.class);
String sPort = env.getProperty("port");
port = Integer.parseInt(sPort);
user = env.getProperty("user");
pass = env.getProperty("pass");
}
@Autowired
private UUID uuidGenerator;
public SpringTest() {
// reuse the already initialized Spring application context
setApplicationContext(context);
}
@Rule
public final FakeSftpServerRule sftpServer =
new FakeSftpServerRule().setPort(port).addUser(user, pass);
@Test
public void test() {
String someBean = context.getBean("namedBean", String.class);
System.out.println(someBean);
System.out.println(uuidGenearator.toString());
System.out.println(sftpServer.getPort());
}
}
一种可能更优雅的方式是在 Spring 配置中定义类似这样的内容:
@Configuration
@PropertySource("classpath:some.properties")
@EnableConfigurationProperties(SftpSettings.class)
static class Config {
...
}
其中SftpSettings 是一个简单的bean 类,例如
@Validated
@Getter
@Setter
@ConfigurationProperties(prefix="sftp")
public class SftpSettings {
@NotNull
private int port;
@NotNull
private String user;
@NotNull
private String pass;
}
然后在 SftpSettings 而不是 Environment 上执行查找:
static {
context = new AnnotationConfigApplicationContext(SpringTest.Config.class);
SftpSettings settings = context.getBean(SftpSettings.class);
port = settings.getPort();
user = settings.getUser();
pass = settings.getPass();
}
这样,Spring 将负责从属性文件中查找值并将这些值转换为适当的格式。