提问者:小点点

使用EasyMock模拟静态字段


我有一堂这样的课:

class Util {
    
    @Autowired
    static DbService service;
    
    public static Data formatData() {
        Data data=service.getData();
        //some logic here
    }
    
    public static void initService() {
        if(service==null){
            service=ObjectLocation.getObject(DbService .class);
        }
    }
}

我需要使用EasyMock模拟服务<代码>EasyMock。createMock()后跟replay()不起作用。P、 S:这是其他开发人员编写的遗留代码,我们不能在这里更改代码。


共1个答案

匿名用户

考虑到服务的范围,假设测试在同一个包中,您可以执行以下操作。

public class UtilTest {

    @Test
    public void formatData() {
        DbService service = mock(DbService.class);
        Data expected = new Data();
        expect(service.getData()).andReturn(expected);
        replay(service);

        Util.service = service;

        assertSame(expected, Util.formatData());

        verify(service);
    }
    
}

如果出于某种原因,测试不在同一个包中,只需替换Util即可。服务=服务依据

Field field = Util.class.getDeclaredField("service");
field.setAccessible(true);
field.set(null, service);