0

在每一本书中,单元测试都应该在断言/验证部分只检查一件事。同时有一个像下面这样的例子

  @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) ”)。在一个测试中混合两个验证是否干净?你怎么看?或者它应该分成两个测试?

4

2 回答 2

2

测试应该分成两个测试

  • 应该ReturnSomething()
  • 应该执行某事()

如果您使用Mockito而不是 EasyMock,那么 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

看到这一点我不会感到非常沮丧,因为这不是在一次测试中检查太多的极端情况,但我倾向于将其拆分:

  @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 回答