我如何使用mockito模拟另一个类中的类方法

时间:2017-09-06 15:47:27

标签: java unit-testing methods junit mockito

我正在尝试使用JUnit和Mockito来模拟端到端方法(addSomething方法)。很明显,在该方法中我使用其他方法。 我的怀疑是:

  • 要模拟端到端方法,我还需要模拟其他方法,对吧?
  • 如何模拟addSomething方法中的方法?

我想要的一个简单例子是:

方法A

public int summing(int sum){
 int A = 5;
 int B = 23;

 sum = SumOfIntegers(A,B);
 return sum;
}

方法B

private int SumOfIntegers(int number1, int number2){

try{
    result = number1 + number2;
 }catch (Exception e) {
        e.printStackTrace();
 }
return result;
}

如何模拟类的方法A,因为它调用了私有方法?

4 个答案:

答案 0 :(得分:2)

单元测试验证单元的公共可观察行为,即返回值与其依赖项的通信

您的案例中的问题是ServerProxy存在隐藏的依赖关系。 你不应该在那个方法中实例化它,而不是在那个类中实例化......

如果您严格遵守关注点/单一责任模式,则依赖关系的实例化是其自身的责任,不应由使用该依赖关系的对象完成。

总之,你应该通过依赖注入 ServerProxy对象注入你的单元中,最好是作为构造函数参数,最有可能使用 DI框架。在这种情况下,使用可以为测试配置的模拟替换ServerProxy是微不足道的。

答案 1 :(得分:1)

您需要模拟addSomething()所属的类。

假设您有一个使用该方法的类。

public class ClassB {
  public String methodB(String jsonSomething) {
     ...
     String result = addSomething("{}");
    ...
  }  
}

public class ClassA {
  public String addSomething(String jsonSomething) {
     ...
  }  
}

在ClassB的测试类中,您将模拟classA对象,并指定addSomething方法的行为。您不需要为addSomething内的内容指定任何模拟行为。

@RunWith(MockitoJRunner.class)
public class ClassBTest {
  @Mock
  private ClassA classA;

  @Test
  testMethodB() {
    given(classA.addSomething(anyString())).willReturn("{}"); // Here you are specifying the mocked behavior for addSomething
    ...
  }
}

答案 2 :(得分:0)

如果您打算模拟对象的方法,这些对象的范围是测试方法的局部范围,那么可能使用类似PowerMock的东西,但实际上这通常表明您的代码编写得不好容易测试。

我建议重构你的代码,以确保使用依赖注入在类级别包含任何具有你想要模拟的方法的对象。通过在测试中使用@Mock注释标记这些对象并使用@InjectMocks标记您的测试类,可以非常简单地使用mockito进行模拟。然后,这将确保将对象的模拟注入到测试中的测试类而不是对象的实际实例中,然后您可以存根所有您喜欢的方法。

答案 3 :(得分:0)

你没有模拟方法,你可以模拟整个类,并在调用方法时让它们以你需要的方式响应。 然后,如果在类中使用方法A,并且此方法A使用方法B,则只模拟方法A.类中的代码不会被执行,因此您不需要模拟整个链。这是嘲弄的重点。那是你问的吗?

所以你永远不会模拟你在Main方法中使用的方法。