代码之家  ›  专栏  ›  技术社区  ›  dash-tom-bang

JUnit和文件结构中的fixture

  •  1
  • dash-tom-bang  · 技术社区  · 14 年前

    我认为自己是一个相当有经验的C++程序员,在该语言中有相当大的TDD经验;最近使用UNITTEST ++。我是Java新手,一旦我掌握了Java的知识,就打算瞄准Android。

    我做了什么 希望 要执行的操作类似于此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++中,我将把这一切都扔进一个测试.cpp文件并完成;多个装置都测试一个客户机类。对我来说很有意义。

    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?
    }
    

    org.junit.tests.AllTests )当我试图模仿它时,它会给我编译错误。

    编辑: 很大程度上我对文件结构很好奇。由于缺乏回应,我开始认为把所有这些东西都放在一个文件中不是特别可行。那么,在开发这样的测试时,人们是如何用Java构建它们的呢?我会创造一个试验台包中,有许多测试类只包含少量的测试,或者人们只是继续接受复制并将它们塞进一个测试类中?(UnitTest++的易用性让我觉得自己被宠坏了,在这里我包含一个文件来获取它的所有特性,在这里我可以拥有一堆类来测试一个文件中的特性,这是不是太容易放弃了?)

    2 回复  |  直到 14 年前
        1
  •  1
  •   Yishai    14 年前

    Java有一个限制,即一个文件中只能有一个公共顶级类,因此您要寻找的样式类型不完全是“Java”方式,但是如果您想要这种样式,那么在TestNG中它更自然,因此我建议您也考虑这种框架。

    在JUnit中,您要做的是拥有一个外部类,它是所有这些不同类的持有者:

    @RunWith(Suite.class)
    @Suite.SuiteClasses({EmptyDeck.class, DeckWithCards.class})
    public class AllTests {
        public static class DeckTester {
               ///etc.
        }
        public static class EmptyDeck.class extends DeckTester {
              ///etc.
    

    或者你可以看看封闭式.class作为一个替代的运行程序,但是您会遇到DeckTester的问题,因为它本身没有测试。

    一般来说,我更喜欢组合而不是继承,因此继承fixture而不是组合fixture的模式让我有些犹豫。这可能没问题,但在Java中可能限制太多。

        2
  •  0
  •   pcjuzer    14 年前

    我们可以创建一个空类,其中注释中包含可运行类:

    @RunWith(Suite.class)
    @Suite.SuiteClasses({My1Test.class, My2Test.class, My2Test.class})
    public class AllTests {
    }