假设我想编写一个单元测试来测试方法中实现的特定功能。如果我想完全执行这个方法,我将不得不做一些额外的安装工作(模拟对象期望等)。而不是这样做,我使用以下方法:
- 我设置了我有兴趣验证的期望值,然后使测试方法抛出特殊类型的异常(例如TerminateTestException)。
- 进一步在单元测试中,我发现异常并验证模拟对象的期望值。投掷特殊类型的异常终止单元测试
它工作正常,但我不确定这是不错的做法。我不会定期这样做,只有在节省时间和精力的情况下。有一点可以想到,使用它的一个理由是抛出异常需要很长时间,所以测试的执行速度比使用不同方法时要慢。编辑:
只是为了澄清,我不修改SUT代码。我所做的是提供一个模拟对象或重写SUT类,以便在我感兴趣的部分执行后SUT退出执行。
private class TestCalculationService : CalculationService
{
public bool ValidateForSyncCalled;
protected override void ValidateForSyncCall()
{
ValidateForSyncCalled = true;
throw new ExceptionToTerminateTest();
}
}
[TestMethod]
public void CalculationService_Calculate_Sync_Calls_ValidateForSyncCall()
{
InitializeMocks();
TestCalculationService calculationService = new TestCalculationService();
calculationService.MessageInstanceFactory = _mockMessageInstanceFactory;
try
{
calculationService.Calculate(null);
Assert.Fail("Exception should have been thrown");
}
catch (ExceptionToTerminateTest)
{
//ok
}
Assert.IsTrue(calculationService.ValidateForSyncCalled);
}