【问题标题】:Junit extend test case to test childJunit扩展测试用例来测试孩子
【发布时间】:2013-05-28 13:54:03
【问题描述】:

我有课程和测试用例FormTest 测试Form

public class Form {
   public doSomething() {} 
}

public class GreenForm extends Form  {
   @Override
   public doSomething() {}
}

public class YellowForm  extends Form {
}

public class FormTest {
   Form form = new Form();

   @Test
   public void doSomethingTest() { getForm().doSomething() }

   public Form getForm() { return form; }
}

扩展FormTest 是测试GreenForm 和覆盖方法的正确方法吗? 例如:

public class GreenFormTest extends FormTest  {
   Form form = new GreenForm();

   @Override
   public Form getForm() { return form; }
}

【问题讨论】:

  • 您的继承语法似乎有些问题。 GreenForm 覆盖 Form 的方法而不扩展它,GreenFormTest 缺少其父类的名称。
  • @DanielLerps 谢谢你的指出,我希望这个小语法错误没有让你对我的问题感到困惑

标签: java unit-testing junit tdd


【解决方案1】:

我同意您关于如何测试并定期执行此操作的想法。我遵循的模式是这样的:

public class FormTest{
    private Form form;

    @Before 
    public void setup(){
        // any other needed setup
        form = getForm();
        // any other needed setup
    }

    protected Form getForm(){
        return new Form();
    }

    @Test
    // do tests of Form class
}

public class GreenTest{
    private GreenForm form;

    @Before 
    public void setup(){
        form = getForm();
        // any other needed setup
        super.setup();
        // any other needed setup
    }

    @Override
    protected Form getForm(){
        return new GreenForm();
    }

    @Test
    // do tests of how GreenForm is different from Form
    // you might also need to override specific tests if behavior of the method
    // under test is different
}

【讨论】:

    【解决方案2】:

    您可以使用 TestCase 的setUp() 方法。

    public class Form
    {
        public void doSomething(){}
    }
    
    public class GreenForm extends Form
    {
        @Override
        public void doSomething(){}
    }
    

    通过测试:

    public class FormTest extends TestCase
    {
        protected Form f;
    
        @Before
        public void setUp()
        {
            f = new Form();
        }
    
        @Test
        public void testForm()
        {
            // do something with f
        }
    }
    
    public class GreenFormTest extends FormTest
    {
        @Before
        @Override
        public void setUp()
        {
            f = new GreenForm();
        }
    }
    

    【讨论】:

    • 这种方法排除了FormTest@Before中做任何事情的能力
    • 你可以调用super.setUp()来执行你想让FormTest做的所有事情。您只需在 super 调用之后指定子类的 setUp() 中的任何更改。
    • 没错,但是拥有protected 字段是不好的做法。我提出了一个建议,这与此非常相似,但使用的是我通常采用的形式。
    • 我明白你的意思。但是,如果子类有需要测试的其他方法,则在隐藏属性时允许调用它们。假设GreenForm 有一个方法doSomethingElse() 也需要测试。为了在GreenFormTest 中访问f,它要么需要受到保护,要么需要一个getter 方法(如果你有多个测试对象,这会变得很困难)。
    • 实际上,我建议GreenFormTest 拥有自己的GreenForm 类型引用,而不是尝试使用FormTest's Form 可能必须不断转换的引用。查看我的回答,了解我的意思。
    猜你喜欢
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多