我正在尝试为以下方法编写测试类
public class CustomServiceImpl implements CustomService {
@Value("#{myProp['custom.url']}")
private String url;
@Autowire
private DataService dataService;
我在类中的一个方法中使用了注入的url值.
为了测试这个,我写了一个junit类
@RunWith(MockitoJUnitRunner.class)
@ContextConfiguration(locations = { "classpath:applicationContext-test.xml" })
public CustomServiceTest{
private CustomService customService;
@Mock
private DataService dataService;
@Before
public void setup() {
customService = new CustomServiceImpl();
Setter.set(customService, "dataService", dataService);
}
...
}
public class Setter {
public static void set(Object obj, String fieldName, Object value) throws Exception {
Field field = obj.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
field.set(obj, value);
}
}
在applicationContext-test.xml中我正在使用加载属性文件
<util:properties id="myProp" location="myProp.properties"/>
但是在运行测试时,不会在CustomService中加载url值.
我想知道是否有办法完成这项工作.
谢谢
解决方法:
您可以自动装入mutator(setter),而不仅仅是注释私有字段.然后您也可以使用测试类中的setter.不需要公开它,包私有会做,因为Spring仍然可以访问它,但是否则只有你的测试可以进入那里(或同一包中的其他代码).
@Value("#{myProp['custom.url']}")
String setUrl( final String url ) {
this.url = url;
}
我不喜欢自动装配(与我的代码库相比)仅仅用于测试,但是从测试中改变测试类的替代方案简直是不圣洁的.