如何测试具有不同例外和结果的方法?

时间:2019-04-26 12:57:14

标签: java junit

如何实现具有不同结果和例外的测试方法?

我简化了代码以使理解:

<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个不同的测试,还是可以组合“参数化”和“预期例外”方法?

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));
}

如您所见,不再需要进行一项测试/例外...