class Something {
public void add(Integer value) {
// ...
}
public boolean has(Integer value) {
// ...
}
}
Метода наподобие get() в классе не имеется. Как я могу протестировать эти два метода? Начиная с написания с теста для add() (или для has(), неважно) придется использовать has(), который мы еще не протестировали и поэтому не знаем, правильно ли он работает. Т.е. до того, пока мы не протестим метод has(), мы не сможем протестить метод add(). Таким же образом с методом has(), ведь его мы не сможем проверить, не добавляя элементы в него.
Как лучше решить подобное?
Re: Как протестировать это?...
От:
Аноним
Дата:
05.02.13 15:31
Оценка:
Здравствуйте, kurel, Вы писали:
Конструктор или какой-нибудь метод инициализации у этого класса имеется?
Здравствуйте, Аноним, Вы писали:
А>Конструктор или какой-нибудь метод инициализации у этого класса имеется?
Нет, только конструктор по-умолчанию — он создается пустым.
Re[3]: Как протестировать это?...
От:
Аноним
Дата:
05.02.13 16:30
Оценка:
Здравствуйте, kurel, Вы писали:
K>Здравствуйте, Аноним, Вы писали:
А>>Конструктор или какой-нибудь метод инициализации у этого класса имеется? K>Нет, только конструктор по-умолчанию — он создается пустым.
Осталось узнать для какого значения метод has вернет истину сразу после создания объекта, сразу после выполнения конструктора по умолчанию. То есть надо узнать чем равно значение по умолчанию "закрытой переменной типа Integer", с которым работают тестируемые методы.
Здравствуйте, Аноним, Вы писали:
А>Осталось узнать для какого значения метод has вернет истину сразу после создания объекта, сразу после выполнения конструктора по умолчанию. То есть надо узнать чем равно значение по умолчанию "закрытой переменной типа Integer", с которым работают тестируемые методы.
Простите, похоже я неправильно объяснил, что мне нужно.
Вопрос был об общем случае. Допустим есть класс-контейнер, который позволяет добавлять в него элементы и узнавать, содержит ли он какой-то элемент, но не позволяет получить содержащийся(еся) элемент(ы). Как можно протестировать два данных метода (add() и has()), если тестирование одного из них возможно только с использованием другого метода? Или это все таки невозможно сделать?
Re[5]: Как протестировать это?...
От:
Аноним
Дата:
05.02.13 17:17
Оценка:
Здравствуйте, kurel, Вы писали:
K>... Как можно протестировать два данных метода (add() и has()), если тестирование одного из них возможно только с использованием другого метода? Или это все таки невозможно сделать?
В виду того что результат работы этих методов зависит от внутреннего состояния тестируемого объекта, без знания этого состояния невозможно протестировать этот объект. Вообще то можно, если предварительным брутфорсом "узнать" внутреннее состояние (метод тестирования черного ящика, вроде так называется). После инициализации объект имеет заранее известное внутреннее состояние, иначе этот объект бесполезен с практической точки зрения.
Здравствуйте, kurel, Вы писали:
k> Метода наподобие get() в классе не имеется. Как я могу протестировать эти два метода?
Добавить метод count, или isEmpty — это не раскрывает список элементов, но позволяет узнать состояние контейнера (count для тестирования предпочтительней). В противном случае кот получается ни жив и не мертв.
K>>Как лучше решить подобное? A>Не заморачиваться.
Ответ нужно понимать как —
1. Не тестировать подобный класс вообще
2. Тестировать has через add, а add через has соответ.
3. Переписать так, чтобы …
4. ???
Здравствуйте, Anton Batenev, Вы писали:
AB>Добавить метод count, или isEmpty — это не раскрывает список элементов, но позволяет узнать состояние контейнера (count для тестирования предпочтительней). В противном случае кот получается ни жив и не мертв.
В контейнере может быть не так просто реализовать count или isEmpty.
Например, если контейнер реализован через битовый массив.
А в чем сложность?
Если не было add до has, будет false, ну а дальше уже бежишь по тестируемому списку значений и проверяешь {add(x), has(x)}. при двух условиях, если добавил и если не добавил
Здравствуйте, kurel, Вы писали:
K>Метода наподобие get() в классе не имеется. Как я могу протестировать эти два метода?
Вы совершаете методологическую ошибку Не надо тестировать методы, надо тестировать контракт через наблюдаемое поведение. Контракт у вас: если добавили, то оно есть, если не добавили, то его нету. "Наблюдаемое" здесь — во-первых знание вызывался add() или нет (т.к. вы его сами в тесте вызываете) и во-вторых has(), который возвращает true/false.