静态实例上的模拟方法

时间:2017-11-14 15:34:33

标签: java unit-testing mockito

我有一个班级:

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(属性属性)

如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

static final不是一个很棒的设计。 最好是注入依赖项,让框架(spring或其他)担心控制单例。 那说, 在你的情况下, 使用反射使用模拟工厂设置Factory instance变量。