在每本书中都写了单元测试应该在断言/验证部分只检查一件事。同时,以下是一个例子
@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)“)。在一次测试中混合两种验证是否干净?你怎么看?或者它应该在两次测试中分开?
答案 0 :(得分:2)
测试应分为两个测试
如果使用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();
}