2015-08-24 51 views
1

方法的Mockito调用的代码具有类似没有对象

Speed speed = readSpeed(Point A, Point B); 
isOverLimit = limitCheck.speedCheck(speed); 

如何使用读取速度的Mockito?

Mockito.when(readSpeed(0, 0).then ...

想我应该用类对象调用这个?

回答

2

Mockito通过创建委托每个可覆盖的实现到模拟框架的单独的对象的子类来有效地工作。

因此,您不能使用在的Mockito一次或情况下在你的系统下测试创建嘲笑你的方法(readSpeed)为所有的情况下,也没有嘲笑任何静态或最终方法。如果readSpeed是其中任何一个,或者需要在您的测试中未涉及的实例上嘲笑,Mockito将不适合您;您需要重构或使用PowerMockito(它悄然重写您的测试系统以重定向构造函数,最终调用以及静态调用Mockito框架)。

如果readSpeed您的系统上测试一个公共非最终实例方法,那么你可以嘲笑它,那会被调用您的组件的部分模拟。部分模拟可能是有用的,但也可以被认为是“代码气味”(如Mockito documentation中所述):理想情况下,您的测试类应该是测试的原子单元,并且模拟应该发生在依赖关系附近您的测试系统比你的测试本身。否则,你可以很容易地测试规范或测试模拟框架,而不是测试你的组件。

虽然更好的事情是将类分割成更小的相互连接的部件,您可以使用部分嘲讽中的Mockito这样的:

@Test public void componentChecksSpeed() { 
    YourComponent yourComponent = Mockito.spy(new YourComponent()); 

    // Use doReturn, because the when syntax would actually invoke readSpeed. 
    doReturn(65).when(yourComponent).readSpeed(any(Point.class), any(Point.class)); 

    yourComponent.run(); 
}