我有兴趣了解如何设计我的 junit 测试用例,以便它们更具可读性和可维护性。这是问题所在 - 在我所有的 junit 测试用例中,我有一些预定义的步骤要执行,如下所示
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;
}
}
}
这减少了编号。每个测试用例需要进行的方法调用次数。有更好的想法吗?