Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 同一单元测试中的状态和行为验证-是否干净?_Unit Testing_Junit - Fatal编程技术网

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

Unit testing 同一单元测试中的状态和行为验证-是否干净?,unit-testing,junit,Unit Testing,Junit,在每本书中,单元测试都应该在assert/verify部分只检查一件事。同时,下面有一个这样的例子 @Test public void shouldReturnSomethingAndExecuteExternalComponent(){ // Given ExternalComponent externalComponent = EasyMock.createStrictMock(ExternalComponent.class); configureMock(

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

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

测试应该分为两个测试

  • 应该返回某物
  • 是否应执行甲基化()
如果您使用而不是EasyMock,那么shouldExecuteSomething看起来会更好,因为您不必在执行测试之前定义外部组件的已验证行为

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

  // When
  objectUnderTest.foo();

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

测试应分为两个测试

  • 应该返回某物
  • 是否应执行甲基化()
如果您使用而不是EasyMock,那么shouldExecuteSomething看起来会更好,因为您不必在执行测试之前定义外部组件的已验证行为

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

  // When
  objectUnderTest.foo();

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

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

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

  }

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

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

  }

+1:奇怪的是,它坐了7个小时,然后同时得到了两个一致的答案!下次我们甚至可以避免15秒的延迟;-)这不会导致重复测试的准备代码吗?(例如“给定”部分)。在这种情况下,您会将公共代码提取到一个方法中吗?是的,但我认为测试中的代码复制应该与生产代码中的代码复制不同。为了可读性,测试中的代码复制有时是有帮助的。+1:奇怪的是,它坐了7个小时,然后同时得到了两个一致的答案!下次我们甚至可以避免15秒的延迟;-)这不会导致重复测试的准备代码吗?(例如“给定”部分)。在这种情况下,您会将公共代码提取到一个方法中吗?是的,但我认为测试中的代码复制应该与生产代码中的代码复制不同。为了可读性,测试中的代码复制有时是有帮助的。