如何模拟最终对象的外部依赖项?

时间:2017-07-25 15:58:09

标签: java unit-testing junit mockito powermock

public class A{
   private final B b;
   public void meth() {
      //Some code
      Integer a = b.some_method(a,fun(b));
      //Some code
   }
   private fun(int b) {
     return b;
   }
}
 when(b.some_method(anyInt(),anyInt())).thenReturn(100)

如何在为类A编写单元测试时模拟外部依赖项。当我以上述方式模拟依赖项时,“a”的值未按预期分配给100。

2 个答案:

答案 0 :(得分:1)

实际上Jakub的答案是正确的。也许你需要一个例子来了解如何做到这一点。检查我的示例的main方法和构造函数。

public class A {
    private final B b;

    public A(B b) {
        this.b = b;
    }

    public void meth() {
        //Some code
        Integer a = b.some_method(5,fun(5));
        //Some code
        System.out.println(a);
    }
    private int fun(int b) {
        return b;
    }

    public static void main(String[] args) {
        B b = Mockito.mock(B.class);

        when(b.some_method(anyInt(), anyInt())).thenReturn(100);

        new A(b).meth();
    }

}

使用构造函数,您必须使用模拟设置B(请参阅main方法中的最后一行)。 当您运行main方法时,您将看到System.out的输出,它是100。

答案 1 :(得分:0)

您可以使用powermock库来模拟最终对象。这是他们的维基的实现。

测试类:

public class StateFormatter {

private final StateHolder stateHolder;

public StateFormatter(StateHolder stateHolder) {
    this.stateHolder = stateHolder;
}

public String getFormattedState() {
    String safeState = "State information is missing";
    final String actualState = stateHolder.getState();
    if (actualState != null) {
        safeState = actualState;
    }
    return safeState;
 }
}

测试代码段

StateHolder stateHolderMock = createMock(StateHolder.class);
StateFormatter tested = new StateFormatter(stateHolderMock);

expect(stateHolderMock.getState()).andReturn(expectedState);

        // PowerMock.replay(..) must be used. 
replay(stateHolderMock);

您可以找到full sample here

  1. 您必须将类A中的构造函数更改为参数化。
  2. 通过传递使用powermock
  3. 创建的模拟对象B来创建对象