0

どの本にも、単体テストでは assert/verify セクションで 1 つのことだけをチェックする必要があると書かれています。そして同時に、以下のような例があります

  @Test
  public void shouldReturnSomethingAndExecuteExternalComponent(){

    // Given
    ExternalComponent externalComponent = EasyMock.createStrictMock(ExternalComponent.class);
    configureMock(externalComponent);

    // When
    Result result = objectUnderTest.foo();

    //Then
    Result expectedResult = ...
    Assert.assertEquals(expectedResult, result);
    externalComponent.verify(); 

  }

この場合、動作がチェックされ (externalComponent の実行 - externalComponent.verify() )、テスト後のオブジェクトの状態がチェックされます (" assertEquals(expectedResult, result) ")。1 つのテストに 2 つの検証が混在しているのはクリーンですか? どう思いますか?それとも、2 つのテストで分割する必要がありますか?

4

2 に答える 2

2

テストは 2 つのテストに分割する必要があります

  • shouldReturnSomething()
  • shouldExecuteSomething()

EasyMockの代わりに Mockitoを使用すると、テストを実行する前に外部コンポーネントの検証済みの動作を定義する必要がないため、shouldExecuteSomething の見栄えが良くなります。

@Test
public void shouldExecuteSomething(){
  // Given
  ExternalComponent externalComponent = mock(ExternalComponent.class);
  objectUnderTest.use(externalComonent)

  // When
  objectUnderTest.foo();

  //Then
  verify(externalComponent).someMethod(); 
}
于 2013-01-17T16:18:08.423 に答える
1

1 つのテストであまりにも多くのチェックを行うという極端なケースではないため、これを見てひどく動揺することはありませんが、分割する傾向があります。

  @Test
  public void shouldReturnSomething(){

    // Given
    ExternalComponent externalComponent = EasyMock.createStrictMock(ExternalComponent.class);
    configureMock(externalComponent);

    // When
    Result result = objectUnderTest.foo();

    //Then
    Result expectedResult = ...
    Assert.assertEquals(expectedResult, result);

  }


  @Test
  public void shouldExecuteExternalComponent(){

    // Given
    ExternalComponent externalComponent = EasyMock.createStrictMock(ExternalComponent.class);
    configureMock(externalComponent);

    // When
    Result result = objectUnderTest.foo();

    //Then
    externalComponent.verify(); 

  }
于 2013-01-17T16:18:23.507 に答える