2016-12-14 68 views
0

我在服务类有成员:如何模拟注入属性文件值的字符串值?

@Value("${dynamodb.aws.region}") 
private String region; 

使用时对生产的类,在使用Spring从我.properties文件被注入的值。

然后,在测试模式下,我需要检查这个代码:

@Override 
public void init() { 
    if (StringUtils.isEmpty(region)){ 
     String msg = "Connection to DynamoDB couldn't be established. Region value is empty."; 
     logger.error(msg); 
     throw new IllegalArgumentException(msg); 
    } 
    this.dynamoDB = new DynamoDB(Regions.fromName(region)); 
} 

除了使用getter和setter,什么是注射在测试这个值的最佳方式?

回答

2

使用Spring ReflectionTestUtils来设置来自Test类的属性值。

ReflectionTestUtils.setField(targetObject, name, value); 
+0

通过使用这种方法,哪些成员应该被嘲笑? – roeygol

+0

通过使用此设置,您可以将值设置为私有字段。 – Jobin

+0

我的“区域”成员是否需要被抽取? – roeygol

2

您也可以在src/test/resources中添加application.properties(或.yml)。在那里你可以定义你想让Spring在测试阶段注入什么值。

0

如果你正在做集成测试,那么春天为您提供至少2种方式做这件事的:

  1. 保持您的测试配置中src/test/resources
  2. 使用测试utils的(测试注释或环境抽象)在测试开始之前设置所需的属性

如果您正在进行非集成测试(没有弹簧),那么您必须自行完成。一种方法是使用反射(但它很糟糕)。换句话说,最好的方法,imho,是重构并始终通过构造函数自动装入,而不是通过字段。这样在单元测试中,您可以在创建时明确地配置对象:

private final String region; 

@Autowired 
public MyClass(@Value("${dynamodb.aws.region}") String region) { 
    this.region = region; 
} 

是的,这是更多的打字。但你会获得不变性和非常简单的测试。此外,现在您可以将您的断言从init移至构造函数。这给你更好的保护。没有人会甚至能够创建不正确的对象,你不必记得在你的测试中调用init方法,也不知道是否肯定会调用它(可能在方法名称中存在拼写错误)