Java 设计junit测试用例-每个测试用例的预定义步骤
我对如何设计junit测试用例以使它们更具可读性和可维护性感兴趣。这就是问题所在——在我所有的junit测试用例中,我都有一些预定义的步骤要执行,如下所示Java 设计junit测试用例-每个测试用例的预定义步骤,java,junit,code-design,Java,Junit,Code Design,我对如何设计junit测试用例以使它们更具可读性和可维护性感兴趣。这就是问题所在——在我所有的junit测试用例中,我都有一些预定义的步骤要执行,如下所示 public class MyTestClass { private Service myService; @Test public void testCase1() { mockObjectX("A"); mockObjectY(1); mockObjectZ("M", 1); myService.va
public class MyTestClass {
private Service myService;
@Test
public void testCase1() {
mockObjectX("A");
mockObjectY(1);
mockObjectZ("M", 1);
myService.validate("value1", "value2");
}
@Test
public void testCase2() {
mockObjectX("Q");
mockObjectY(5);
mockObjectZ("Z", 10);
myService.validate("value3", "value4");
}
private void mockObjectZ(String value1, int value2) {
//mock object Z
}
private void mockObjectY(Integer value) {
//mock object Y
}
private void mockObjectX(String value) {
//mock object X
}
}
问题是如果我要添加一个新的测试用例,我需要确保新的测试用例调用mockObjectX(),mockObjectY(),mockObjectZ()。有没有更好的方法(更易于维护的方法)来设计我的测试用例,以便添加新的测试用例变得更简单
我认为@Before不能使用,因为mock*方法接受参数
我可以想到的一种方法是使用一个类,该类包含模拟对象X、Y和Z所需的每个参数值的方法
public class MyTestClass {
private Service myService;
@Test
public void testCase1() {
mockObjects(new TestCase1());
myService.validate("value1", "value2");
}
@Test
public void testCase2() {
mockObjects(new TestCase2());
myService.validate("value3", "value4");
}
private void mockObjects(ServiceObjectMocker serviceObjectMocker) {
//mock object x, y and z by calling respective methods from serviceObjectMocker
}
private class ServiceObjectMocker {
protected Object[] getValuesForObjectZ() {
//pass default values
return new Object[] {};
}
protected Integer getValuesForObjectY() {
//pass default values
return 1;
}
protected String getValuesForObjectX() {
//pass default values
return "A";
}
}
private class TestCase1 extends ServiceObjectMocker {
@Override
protected String getValuesForObjectX() {
return "B";
}
}
private class TestCase2 extends ServiceObjectMocker {
@Override
protected String getValuesForObjectX() {
//pass different values
return "Q";
}
@Override
protected Integer getValuesForObjectY() {
//pass default values
return 10;
}
}
}
这减少了每个测试用例需要进行的方法调用的数量。有更好的想法吗?如果你每次都在做同样的事情,那只是数据不同,然后看看 然后,您可以有类似(未测试和未编译)的内容:
@RunWith(参数化的.class)
公共类MyTestClass{
@参数
公共静态列表数据(){
返回Arrays.asList(新对象[][]{
{“A”,1,“M”,1,“value1”,“value2”},
{“Q”,5,“Z”,10,“value3”,“value4”},
});
}
私有字符串xValue;
私人内部价值;
私有字符串;
私有int-zValueInt;
应为私有字符串1;
应为私有字符串2;
公共MyTestClass(字符串xValue、int yValue、字符串zValueString、int zValueInt、字符串expected1、字符串expected2){
这个.xValue=xValue;
this.yValue=yValue;
this.zValueString=zValueString;
this.zValueInt=zValueInt;
this.expected1=expected1;
this.expected2=expected2;
}
@试验
公开无效测试(){
mockObjectX(xValue);
mockObjectY(yValue);
mockObjectZ(zValueString,zValueInt);
验证(expected1,expected2);
}
}
然后,您只需定义一次测试。我仍然需要调用三个方法——mockObjectX、mockObjectY和mockObjectZ,这就是我想要减少的,以使测试用例更易于维护。您说:“问题是,如果我要添加一个新的测试用例,我需要确保新的测试用例调用mockObjectX(),mockObjectY(),mockObjectZ()。是否有更好的方法(更易于维护的方法)来设计我的测试用例,以便添加新的测试用例变得更简单。要将新的测试用例添加到参数化的测试用例,您需要在data()返回的列表中添加一行。这不是你想要的吗?我明白你的意思。我尝试将@Parmeterized与ServiceObjectMocker一起使用,效果很好。谢谢
@RunWith(Parameterized.class)
public class MyTestClass {
@Parameters
public static List<Object[]> data() {
return Arrays.asList(new Object[][] {
{ "A", 1, "M", 1, "value1", "value2" },
{ "Q", 5, "Z", 10, "value3", "value4" },
});
}
private String xValue;
private int yValue;
private String zValueString;
private int zValueInt;
private String expected1;
private String expected2;
public MyTestClass(String xValue, int yValue, String zValueString, int zValueInt, String expected1, String expected2) {
this.xValue = xValue;
this.yValue = yValue;
this.zValueString = zValueString;
this.zValueInt = zValueInt;
this.expected1 = expected1;
this.expected2 = expected2;
}
@Test
public void test() {
mockObjectX(xValue);
mockObjectY(yValue);
mockObjectZ(zValueString, zValueInt);
myService.validate(expected1, expected2);
}
}