Java Junit将测试用例扩展到测试子级

Java Junit将测试用例扩展到测试子级,java,unit-testing,junit,tdd,Java,Unit Testing,Junit,Tdd,我有类和测试用例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(

我有类和测试用例
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; }
}

您可以使用TestCase的
设置
()方法来实现这一点

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();
    }
}

我同意你关于如何测试和定期做的想法。我遵循的模式是:

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
}

您似乎在继承语法方面遇到了一些问题
GreenForm
重写Form方法而不扩展它,并且
GreenFormTest
缺少其父类的名称。@DanielLerps感谢您指出,我希望这个小的语法错误没有让你对我的问题感到困惑。这个方法排除了
FormTest
@之前执行
@中任何操作的能力。你可以调用
super.setUp()
来执行你想执行的所有
FormTest
操作。您只需在超级调用后指定子类的
setUp()
中的任何更改即可。虽然如此,使用
protected
字段是不好的做法。我已经提出了一个建议,这个非常类似于这个,但使用我通常采取的形式。我明白你的观点。但是,如果子类有其他需要测试的方法,则在隐藏属性时允许调用这些方法。比如说,
GreenForm
有一个方法
doSomethingElse()
也需要测试。为了访问
GreenFormTest
中的
f
,需要对其进行保护或使用getter方法(如果有多个测试对象,这会变得很困难)实际上,我建议
GreenFormTest
将有它自己的
GreenForm
类型的引用,而不是尝试使用
FormTest的
Form
引用,这可能需要不断转换。看看我的答案,看看我的意思。