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
引用,这可能需要不断转换。看看我的答案,看看我的意思。