2011-10-10 51 views
3

我们应该运行对阵双方真正的DAO /数据库,并针对模拟DAO来验证模拟DAO的行为与实际的DAO DAO测试。为此,我们有这样的结构:TestNG的测试继承和组

public abstract class DAOTestBase 
{ 
    public void testSimple() 
    { 
     // dummy assertion 
     assertTrue(true, "Hello"); 
    } 
} 


@Test(groups = "fast") 
public class TestMockDAO extends DAOTestBase 
{ 
    // setUp/tearDown and helper methods for mock 
} 


@Test(groups = "slow") 
public class TestDAO extends DAOTestBase 
{ 
    // setUp/tearDown and helper methods for real DB 
} 

不幸的是,这并不工作 - TestNG的并不认为该testSimple方法是一个测试,因此将不会运行它。所以不是我试图注释testSimple方法(或DAOTestBase类):

  • 一个@Test注解没有任何团体会导致同样的效果 - 测试将不会对任何fast也不slow组运行。

  • 一个@Test批注与团体fastslow会导致相反的效果 - 既TestMockDAOTestDAO将无论不仅速度快或慢的只测试应该运行运行。

  • @Test注解与不同的基团,说common,加在两个TestMockDAOTestDAO加入dependsOnGroups="common"注释除非common被包括在组运行这再次导致上述情况2(两者TestMockDAOTestDAO也将不工作正在运行)。

最后,我正在寻找一种方法,能够定义组在子类继承的测试,但它好像在@Test注释仅适用于测试方法在那个同类中,不是也没有继承的方法,没有@Test注释。有没有其他的方式来实现这一点(不覆盖子类中的所有方法)?

回答

1

您是否尝试过简单地DAOTestBase的顶部上添加注解@Test?每个子类都会用自己的组覆盖它,这应该使基础中的方法成为测试方法。

+0

我试过了,但它不起作用。继承的方法将在默认组中(或者我在基类的'@ Test'注释中指定的任何组),而不在相应的子类所在的组中。 –

0

我解决这样说:

在基类中的方法是在“基地”组,但需要检查测试已被初始化。

public abstract DaoTestBase { 
    private boolean initialized = false; 

    @Test(groups = "base") 
    public void testSimple() { 
     if (!initialized) { return; } 

     // dummy assertion 
     assertTrue(true, "Hello"); 
    } 
} 

测试在子类中的BeforeClass注释方法中初始化。

@BeforeClass 
protected void initialize() { 
    super.initialized = true; 
} 

如果注释父类的替代方法,你必须通过inheritGroups = false,并且组,因为它也继承了集团的基类,它不会工作。

现在,您必须运行TestNG来检查组基地,快速或基地,缓慢。两个测试都会执行,但未初始化的将不会执行任何操作。

这是丑陋的,我不会推荐它(它看起来更好重新定义子方法和调用相应的超级方法),但在我的情况下,我需要优先考虑我的测试方法,我想避免在每个孩子班重复。