Unit testing 同一单元测试中的状态和行为验证-是否干净?
在每本书中,单元测试都应该在assert/verify部分只检查一件事。同时,下面有一个这样的例子Unit testing 同一单元测试中的状态和行为验证-是否干净?,unit-testing,junit,Unit Testing,Junit,在每本书中,单元测试都应该在assert/verify部分只检查一件事。同时,下面有一个这样的例子 @Test public void shouldReturnSomethingAndExecuteExternalComponent(){ // Given ExternalComponent externalComponent = EasyMock.createStrictMock(ExternalComponent.class); configureMock(
@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)”)。在一次测试中混合两次验证是否干净?你怎么认为?或者应该在两个测试中分开?测试应该分为两个测试
- 应该返回某物
- 是否应执行甲基化()
@Test
public void shouldExecuteSomething(){
// Given
ExternalComponent externalComponent = mock(ExternalComponent.class);
objectUnderTest.use(externalComonent)
// When
objectUnderTest.foo();
//Then
verify(externalComponent).someMethod();
}
测试应分为两个测试
- 应该返回某物
- 是否应执行甲基化()
@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秒的延迟;-)这不会导致重复测试的准备代码吗?(例如“给定”部分)。在这种情况下,您会将公共代码提取到一个方法中吗?是的,但我认为测试中的代码复制应该与生产代码中的代码复制不同。为了可读性,测试中的代码复制有时是有帮助的。