0

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

}
}

これにより、番号が減少します。各テスト ケースで実行する必要があるメソッド呼び出しの数。より良いアイデアはありますか?

4

1 に答える 1

2

毎回同じことを実際に行っている場合は、変化するのはデータだけです。 @Parameterizedを見てください。

次に、(テストされておらず、コンパイルされていない)のようなものを作成できます。

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

その後、テストを 1 回定義するだけです。

于 2012-10-25T09:14:00.913 に答える