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() を呼び出すことを確認する必要があることです。新しいテストケースの追加がより簡単になるようにテストケースを設計するより良い方法 (より保守しやすい方法) はありますか?
mock* メソッドはパラメーターを受け入れるため、 @Before は使用できないと思います。
私が考えることができる1つの方法は、オブジェクト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;
}
}
}
これにより、番号が減少します。各テスト ケースで実行する必要があるメソッド呼び出しの数。より良いアイデアはありますか?