我有一个班级:
public class Factory {
private static final Factory instance = new Factory();
private Factory() {
}
public static Factory getInstance() {
return instance;
}
private Client client = null;
//To be mocked
//Failing at this point
//Not actually using mocked method
public Client getClient(Properties properties) {
//doSomething
//...
return client;
}
}
在上面的另一个类中,方法用作:
public class Service {
protected Client client = null;
protected void keySetup() {
//Should be mocked
client = Factory.getInstance().getClient(properties());
...
...
}
}
对于单元测试keySetup()方法,我试图模拟 Factory.getInstance()。getClient(properties()),但我失败了。
我尝试执行以下操作:
@Test
public void testKeySetupTrue(){
Client client = mock(Client.class);
Factory factory = mock(Factory.class);
ReflectionTestUtils.setField(factory, "client", client);
Properties properties = mock(Properties.class);
Mockito.doReturn(client).when(factory)
.getClient(properties);
Service service = new Service();
service.keySetup();
...
...
}
当我在调试模式下运行时,我看到它实际上正在执行被模拟的 getClient(属性属性)。
如何解决这个问题?
答案 0 :(得分:1)
static final
不是一个很棒的设计。
最好是注入依赖项,让框架(spring或其他)担心控制单例。
那说,
在你的情况下,
使用反射使用模拟工厂设置Factory instance
变量。