如何实现具有不同结果和例外的测试方法?
我简化了代码以使理解:
<mat-calendar [selected]="selectedDate" (selectedChange)="onSelect($event)" [min]="mindate" [max]="maxdate"></mat-calendar>
那么,如何在public double someCalc(double a, double b, double c) throws ALessThanZeroException, BIsZeroException{
if (a < 0){
throw new ALessThanZeroException();
}
if (b == 0){
throw new BIsZeroException();
}
return a*b*c;
}
中验证此方法?在这种情况下,我需要创建3个不同的测试,还是可以组合“参数化”和“预期例外”方法?
答案 0 :(得分:2)
您可以对其进行参数化测试,但是老实说,可以创建3个单独的测试。它更清晰,并且遵循“准确地给出测试失败的一个原因” 的规则。
所以:
@Test(expected = ALessThanZeroException.class)
public void shouldThrowALessThanZero_WhenIncorrectA() {
//... your logic here
}
@Test(expected = BIsZeroException.class)
public void..... and so on
使用JUnit的@Rule
还有另一种方法:
@Rule
public ExpectedException exceptionRule = ExpectedException.none();
// ...
@Test
public void shouldThrowALessThanZero_WhenIncorrectA() {
exceptionRule.expect(ALessThanZeroException.class);
exceptionRule.expectMessage("A should be greater than 0.");
// ...
}
对于参数化测试,如果要针对不同的输入测试代码并检查输出,我将使用它。这似乎与您的问题类似,但是在您的情况下,您正在测试特定的逻辑,一些极端的情况。请勿将其与“常规”案例混合使用。
答案 1 :(得分:1)
您需要为每种可能的情况创建一种方法。由于您的方法有3个可能的退出点,因此至少需要进行3个测试:
// Check if a is less than 0
@Test(expected = ALessThanZeroException.class)
public void throwsALessThanZero_WhenALessZero() {
yourclass.someCalc(-1.0, 2.0, 30.0);
}
// Check if a is not less than 0 and b is 0
@Test(expected = BIsZeroException.class)
public void throwsBIsZero_WhenAIsNotLessZeroAndBIsZero() {
yourClass.someCalc(2.0, 0.0., 3.4);
}
// Test normal situation
@Test
public void calculate_WhenAIsNotLessZeroAndBIsNotZero() {
double a = 2.0;
double b = 1.0;
double c = 3.0;
double res = yourClass.someCalc(a, b, c);
assertEquals(res, a * b * c);
}
答案 2 :(得分:1)
如果您具有自定义运行时异常(例如,包含状态代码或原因的异常),则可能还需要声明代码/原因。在这种情况下,您可以在Junit 5中执行以下操作:
@Test
void someTestMethod(){
// First case
YourExceptionType exception = assertThrows(YourExceptionType.class, () -> myService.methodToTest(param1, param2));
assertThat(exception.getCode(), is(1001));
// Second case
YourExceptionType exception = assertThrows(YourExceptionType.class, () -> myService.methodToTest(param3, param4));
assertThat(exception.getCode(), is(1002));
}
如您所见,不再需要进行一项测试/例外...