Проблема с использованием метода «Когда» - PullRequest
9 голосов
/ 28 сентября 2011

Я изо всех сил пытаюсь научить себя Мокито.

Рассмотрим следующий метод, hasInventory () , который на самом деле не должен работать в моем мышлении, но настроен так, чтобы возвращать true или false как я беличья клетка мой тест. Класс Склад - это моя "насмешливая зависимость".

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 () выдает исключение, потому что он буквально интерпретирует вызов метода (выполняет его), а инвентаризация равна нулю (см. Выше), 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.

Большое спасибо всем, кто читает это.

Russ

1 Ответ

10 голосов
/ 29 сентября 2011

Mockito не может высмеивать final классы или методы.Попробуйте удалить модификатор final из метода hasInventory.Или, что еще лучше, не издевайтесь над классом Warehouse, а вместо этого имитируйте интерфейс IWarehouse, методы которого не могут быть final и предположительно определяют методы, используемые Order.

В общем, предпочтительно использовать макеты интерфейсов, но это не обязательно.

Отсутствие возможности макетировать final классы или методы кратко упоминается в Mockito FAQ , это связано с техникой генерации классов во время выполнения, используемой для создания макетов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...