如何在mockito中全局模拟方法调用?

时间:2014-07-04 14:56:45

标签: mockito

我需要全局模拟类方法。

我的意思是,我无法创建模拟对象和存根方法。我的api不会将此对象作为参数,因此我无法将其传递给函数调用,但此类的对象是在这些函数内创建的并在那里使用。这就是为什么我需要在全球范围内嘲笑它。

class A {
  public void methodA() {}  
}

我需要模拟methodA()。

我可以想象,通过mockito实现这几乎是不可能的。 有谁知道如何实现这一目标?或者我应该重写我的代码吗?

2 个答案:

答案 0 :(得分:1)

你应该重写你的代码。

您写道:

  

此类的对象是在这些函数内创建的,并在那里使用

如果您想要一个可测试的系统,这通常是一个坏主意。你提到的功能不应该自己创建对象,因此他们甚至不知道它们来自何处或者是谁提供该对象。

更好的方法是让这些功能与接口配合使用。然后,该接口的实现者将成为函数的参数,或者被注入到该函数所属的对象,例如通过控制器。

了解有关这些问题的Inversion of controlDependency Injection。这些概念对于维护模块化且可测试的系统至关重要。许多应用程序开发框架提供了使用依赖注入开发应用程序的必要工具。

答案 1 :(得分:0)

同样在单元测试中,只需使用@Before方法存根调用即可。您可能需要重构代码。一个工厂看起来很明智,你可以使用下面的相同技巧注入该工厂并将其存储在整个测试类中。

@Before public void stub_sessionService_userId() {
  given(sessionService_mock.userId()).willReturn(73L);
}