在同一单元测试中的状态和行为验证 - 它是否干净?

时间:2013-01-17 08:45:28

标签: unit-testing junit

在每本书中都写了单元测试应该在断言/验证部分只检查一件事。同时,以下是一个例子

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

2 个答案:

答案 0 :(得分:2)

测试应分为两个测试

  • shouldReturnSomething()
  • shouldExecuteSomething()

如果使用Mockito而不是EasyMock,那么shouldExecuteSomething看起来会更好,因为在执行测试之前,您不必定义外部组件的已验证行为。

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

  // When
  objectUnderTest.foo();

  //Then
  verify(externalComponent).someMethod(); 
}

答案 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(); 

  }