问题使用Mockito的方法

时间:2011-09-28 14:04:01

标签: java mockito

我正努力自学Mockito。

考虑以下方法, hasInventory(),它不应该以我的思维方式运行,而是设置为返回 true false < / em>当我松鼠笼罩我的测试。类仓库是我的“模拟依赖”。

public class Warehouse implements IWarehouse
{
  private Map< String, Integer >    inventory;

  public Warehouse()
  {
    this.inventory = new HashMap< String, Integer >();
  }

  public final boolean hasInventory( String itemname, int quantity )
      throws InventoryDoesNotExistException
  {
    if( inventory == null )
      throw new InventoryDoesNotExistException();

    if( !inventory.containsKey( itemname ) )
      return false;

    int current = ( inventory.containsKey( itemname ) ) ? inventory.get( itemname ) : 0;

    return( current >= quantity );
  }
  ...

在JUnit测试代码中,第一个 when()抛出异常,因为它从字面上解释了方法调用(执行它),而 inventory 为nil(见上文) ), InventoryDoesNotExistException 被抛出。 mocked依赖类中还有其他方法,例如 add() remove()

@RunWith( MockitoJUnitRunner.class )
public class OrderInteractionTest
{
  private static final String TALISKER = "Talisker";
  private Order   systemUnderTest  = null;

  @Mock
  private Warehouse   mockedDependency = null;

  @Before
  public void init()
  {
    //MockitoAnnotations.initMocks( this );
    //mockedDependency = mock( Warehouse.class );
    this.systemUnderTest  = new Order( TALISKER, 50 );
  }

  @Test  
  public void testFillingRemovesInventoryIfInStock()  
  {  
    try  
    {  
      doNothing().doThrow( new RuntimeException() ).when( mockedDependency ).add( anyString(), anyInt() );  
      doNothing().doThrow( new RuntimeException() ).when( mockedDependency ).remove( anyString(), anyInt() );  
      when( mockedDependency.hasInventory( anyString(), anyInt() ) ).thenReturn( true );  
      when( mockedDependency.getInventory( anyString() ) ).thenReturn( 50 );

据我了解,通过 when()方法,我要求Mockito准确地不要调用 hasInventory(),而只是返回 true 而不是在我测试类时调用它(“systemUnderTest”)。任何人都可以帮助我克服这一点(或者对我的大脑有所了解)吗?

我正在关联 mockito-all-1.8.5.jar 和JUnit 4.

非常感谢所有阅读此内容的人。

拉​​斯

1 个答案:

答案 0 :(得分:10)

Mockito无法模拟final类或方法。尝试从final方法中删除hasInventory修饰符。或者更好的是,不要模拟Warehouse类,而是模拟IWarehouse接口,其方法不能是final,并且可能定义Order使用的接口。

一般来说,最好是模拟接口,但这不是强制性的。

在Mockito FAQ中简要提到了无法模拟final类或方法,这是由于用于创建模拟的运行时类生成技术。