2013-08-01 1 views
1

У меня есть класс, который есть один добытчик, как это:Не понимаю, как издевались классы работает при вызове методов

public Animal get(int id) { 
    final Animal animal = crudRepository.get(id); 
    assetRepository.attachAssets(animal); 

    return animal; 
} 

Я хочу, чтобы создать простой модульный тест для этого. Я высмеивал crudRepository, чтобы всегда возвращать неподвижное животное. Я также высмеивал assetRepository и устанавливал издеваемое хранилище в классе, который я хочу проверить. Однако я не понимаю, как это работает, почему бы мне не получить нулевые указатели и ошибки при вызове метода attachAssets? Он имеет тип возврата void. Я имею в виду, что в методе attachAssets я использую вещи, которые я никогда не создавал (сеансы и т. Д.). Мокито автоматически перехватывает исключения или что-то еще, это что-то особенное для недействительных методов или что? Другими словами, я не зациклил метод attachAssetsassetRepository, так почему бы ему не потерпеть неудачу (или если он даже не сработает, я не знаю)?

ответ

1

Макет - это фиктивная реализация. Это подкласс класса mocked, который переопределяет все его методы и заменяет их реализацию ничем (то есть возвращает то, что вы говорите, чтобы возвращать, бросает то, что вы говорите, чтобы его бросить, и записывает вызовы, чтобы иметь возможность проверить их после).

Вот несколько примеров класса:

public class AssetRepository { 
    public void attachAssets(Animal a) { 
     // some real implementation 
    } 
} 

И вот упрощенный пример макете реализации созданного Mockito:

public class MockAssetRepository extends AssetRepository { 
    private List<Invocation> invocations = new ArrayList<>(); 

    @Override 
    public void attachAssets(Animal a) { 
     // store the invocation to be able to chack if it has been called, 
     // how many times, etc. 
     invocations.add(new Invocation("attachAssets", a); 
    } 
} 

Вы видите, что вся ваша реализация, это не называется, потому что attachAssets() переопределяется в макете.

+0

Конечно, это имеет смысл. Спасибо:) – LuckyLuke

1

Если вы издеваетесь над AssetRepository, методы вызываются на макет, и фактическая реализация уже не имеет значения. Вместо этого Mockito использует фиктивную версию метода (который ничего не делает).

Поведение по умолчанию для Mockito, если вы еще не сказали ему ничего, ничего не делать или возвращать null/0, в зависимости от того, что подходит. Как правило, это просто генерирует исключение, если вы сообщите об этом. Другие издевательские рамки могут жаловаться, если вы вызываете некоторые неожиданные методы.

+0

А как вы это делаете, есть пустые методы, а методы, которые имеют другие типы возвращаемых данных, возвращают значения по умолчанию, указанные в API? – LuckyLuke

+0

Помните, что возвращаемое значение «по умолчанию» методов макета не всегда равно 0, false или null. Это может быть и пустая коллекция "," или 1, при некоторых обстоятельствах. Подробнее см. Документацию. –