Я строю карточную игру, которая имеет отношение только к приведенным ниже примерам.
Я считаю себя довольно опытным программистом на C ++ с большим опытом работы с TDD на этом языке; последний раз с использованием UnitTest ++. Я новичок в Java и собираюсь нацелиться на Android, как только получу Java-ноги.
То, что я хочу сделать, является чем-то похожим на эту настройку UnitTest ++:
class DeckTest
{
public:
Deck deck;
};
class EmptyDeck : public DeckTest
{
// doesn't need to do anything for this simplified example
};
TEST_FIXTURE(EmptyDeck, HasNoCards)
{
CHECK_EQUAL(0, deck.GetNumCards());
}
TEST_FIXTURE(EmptyDeck, ThrowsOnCardAccess)
{
CHECK_THROWS(InvalidCardIndexException, deck.GetCard(0));
}
class DeckWithCards : public DeckTest
{
void setUp()
{
// load deck with a bunch of cards
}
};
TEST_FIXTURE(DeckWithCards, FirstCardIsAccessible)
{
// ...etc.
Теперь в C ++ я просто выбросил бы все это в файл DeckTest.cpp и все было готово; несколько приборов все тестирование одного клиентского класса. Имеет смысл для меня.
Однако в Java я чувствую, что хочу сделать нечто подобное:
class DeckTester {
Deck deck = new Deck();
}
class EmptyDeck extends DeckTester {
@Test
public void EmptyDeckHasNoCards() {
assertThat(deck.GetNumCards(), equalTo(0));
}
@Test(expected=Deck.EmptyDeckException.class)
public void EmptyDeckThrowsWhenGettingCard() throws Deck.EmptyDeckException {
Card card = deck.GetCard(0);
}
}
class DeckWithCards extends DeckTester {
@Before
public void AddCards() {
Card card = new Card(Card.Type.k_missed);
deck.AddCard(card);
// ...or similar...
}
}
public class DeckTests {
// What goes here?
}
... так как у меня может быть только один публичный класс на модуль, я решил, что постараюсь построить набор или что-то еще, но я не могу найти способ сделать это. Я использую различные AllTests.java в дистрибутиве junit-4.8.2, чтобы направлять меня, но тот, который выглядел наиболее многообещающим (org.junit.tests.AllTests
), дает мне ошибки компиляции, когда я пытаюсь имитировать его.
Я подумал, что предпочтительнее было бы иметь внутренние классы, но джунит тоже их не подбирает. Мне неприятно, что мне приходится разбивать их на разные файлы, но, может быть, это просто способ Java?
Советы, которые мы ценим, спасибо!
Редактировать: Во многом мне интересно узнать о файловой структуре. Из-за отсутствия ответа я начинаю думать, что все эти вещи в одном файле практически неосуществимы. Итак, при разработке таких тестов, как люди структурируют их в Java? Буду ли я создавать пакет test.deck с несколькими тестовыми классами, содержащими лишь небольшое количество тестов, или же люди просто пойдут дальше и примут дублирование и объединят их все в один тестовый класс? (Я слишком легко сдаюсь, чувствуя себя испорченным из-за простоты использования UnitTest ++, где я включаю один файл, чтобы получить все его функции, и где у меня может быть группа классов, которые тестируют функцию в одном файле?)