java – mockito中的spring值注入

我正在尝试为以下方法编写测试类

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;
}

我不喜欢自动装配(与我的代码库相比)仅仅用于测试,但是从测试中改变测试类的替代方案简直是不圣洁的.

上一篇:如何模拟影响对象的void返回方法


下一篇:java – Mockito绕过静态方法进行测试