jMock Насмешка Классов и Интерфейса

Закон большой тройки такой, как указано выше.

Простой пример, на простом английском языке, той проблемы, которую он решает:

Деструктор не по умолчанию

Вы выделили память в своем конструкторе и вам нужно написать деструктор, чтобы удалить его. В противном случае вы вызовете утечку памяти.

Вы можете подумать, что это работа.

Проблема будет в том, что если копия сделана из вашего объекта, то копия будет указывать на ту же память, что и исходный объект.

Как только один из них удалит память в своем деструкторе, у другого будет указатель на недопустимую память (это называется висячим указателем), когда он попытается использовать его, вещи станут волосатыми.

Поэтому вы пишете конструктор копирования, чтобы он выделял новым объектам свои собственные фрагменты памяти для уничтожения.

Оператор присваивания и конструктор копирования

Вы выделили память в своем конструкторе на указатель члена вашего класса. При копировании объекта этого класса оператор присваивания по умолчанию и конструктор копирования будут копировать значение этого указателя на новый объект.

Это означает, что новый объект и старый объект будут указывать на один и тот же фрагмент памяти, поэтому, если вы измените его в одном объекте, он будет изменен и для другого объекта. Если один объект удалит эту память, другой продолжит пытаться ее использовать - eek.

Чтобы решить эту проблему, вы пишете собственную версию конструктора копирования и оператора присваивания. Ваши версии выделяют отдельную память для новых объектов и копируют значения, на которые указывает первый указатель, а не его адрес.

5
задан Roy Marco Aruta 9 June 2009 в 04:56
поделиться

1 ответ

Код в том виде, в котором вы его представляете, не компилируется (это должен быть ClassImposteriser.INSTANCE). Приведенный ниже пример кода работает нормально. Не могли бы вы предоставить более подробную информацию?

public class Example {
    private Mockery context = new JUnit4Mockery() {
    {
        setImposteriser(ClassImposteriser.INSTANCE);
    }
    };

    @Test
    public void testStuff() {
    Validator validator = context.mock(Validator.class);
    Person person = context.mock(Person.class);

    // do some stuff...
    }

    public static interface Person {
    }

    public static class Validator {
    }
}
11
ответ дан 13 December 2019 в 19:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: