0

EasyMockテストは次のパターンに従う傾向があるようです。

@Test
public void testCreateHamburger()
{
  // set up the expectation
  EasyMock.expect(mockFoodFactory.createHamburger("Beef", "Swiss", "Tomato", "Green Peppers", "Ketchup"))
    .andReturn(mockHamburger);

  // replay the mock
  EasyMock.replay(mockFoodFactory);

  // perform the test
  mockAverager.average(chef.cookFood("Hamburger"));

  // verify the result
  EasyMock.verify(mockFoodFactory);
}

これは1つのテストでは正常に機能しますが、同じロジックを別の方法で再度テストしたい場合はどうなりますか?私の最初の考えは、次のようなことをすることです。

@Before
public void setUp()
{
  // set up the expectation
  EasyMock.expect(mockFoodFactory.createHamburger("Beef", "Swiss", "Tomato", "Green Peppers", "Ketchup"))
    .andReturn(mockHamburger);

  // replay the mock
  EasyMock.replay(mockCalculator);
}

@After
public void tearDown()
{
  // verify the result
  EasyMock.verify(mockCalculator);
}

@Test
public void testCreateHamburger()
{
  // perform the test
  mockAverager.average(chef.cookFood("Hamburger"));
}

@Test
public void testCreateMeal()
{
  // perform the test
  mockAverager.average(chef.cookMeal("Hamburger"));
}

このアプローチにはいくつかの根本的な問題があります。1つ目は、メソッド呼び出しにバリエーションを持たせることができないということです。テストしたい場合person.cookFood("Turkey Burger")、私のセットアップ方法は機能しません。2番目の問題は、セットアップメソッドでcreateHamburgerを呼び出す必要があることです。私が電話した場合person.cookFood("Salad")、これは当てはまらない可能性があります。anyTimes()この問題を回避するために、またはstubReturn()EasyMockを使用することができます。ただし、これらのメソッドは、メソッドが呼び出されたかどうかを確認するだけであり、メソッドが実際に呼び出されたかどうかではなく、特定のパラメーターを使用して呼び出されます。

これまでに機能した唯一の解決策は、すべてのテストの期待値をコピーして貼り付け、パラメーターを変更することです。 DRYの原則を維持するEasyMockでテストするためのより良い方法を知っている人はいますか?

4

1 に答える 1

2

発生している問題は、ユニットテストがDRYではなくDAMPである必要があるためです。ユニットテストは繰り返される傾向があります。安全な方法で繰り返しを削除できる場合(不必要に結合されたテストが作成されないようにするため)、それを実行します。そうでない場合は、無理に押し込まないでください。単体テストは迅速かつ簡単である必要があります...そうでない場合は、ビジネス価値を書く代わりにテストに多くの時間を費やしています。

ちょうど私の2セント。ところで、RoyOsheroveによるArtof Unit Testingは、ユニットテストに関する優れた読み物であり、このトピックをカバーしています。

于 2012-06-29T18:10:30.080 に答える