2016-07-14 5 views
0

Для моего приложения я хочу, чтобы проверить функцию, которая бросает два Exceptions. Я хочу проверить эти Exceptions от JUnit.тест Junit: Тест множественного исключение

Вот пример:

class MyFoo { 
    public void doSomeStuff(ArrayList<Object> objectList) { 
     if (objectList.size() >= 2) { 
      throw new IllegalArgumentException(""); 
     } 
     if (objectList.size() == 0) { 
      throw new IllegalArgumentException(""); 
     } else { 
      //do further Stuff 
     } 
    } 
} 

Так что теперь я хочу, чтобы проверить эту функцию. Я знаю, как тестировать одно исключение, но есть ли способ проверить оба исключения сразу? Или лучше проверить каждое исключение в собственном тесте?

Вот тест на одно исключение:

public class MyFooTest { 

    @Rule 
    public ExpectedException thrown= ExpectedException.none(); 


    @Test 
    public void testDoSomeStuff() { 
     thrown.expect(IllegalArgumentException.class); 
     List<Object> objectList=new ArrayList<>(); 
     objectList.add(new Object()); 
     objectList.add(new Object()); 
     objectList.add(new Object()); 
     doSomeStuff(objectList); 
    } 
} 

Может быть, я совершенно неправильно, чтобы проверить как исключение сразу. Представь меня.

+2

Оба исключения не будут выбрасываться никогда. Вы должны написать два теста. –

ответ

1

Я бы утверждать, что правильное исключение в двух различных случаях испытания.

@Test(expected = IllegalArgumentException.class) 
public void shouldThrowExceptionWhenListIsEmpty() { 
    doSomeStuff(Collections.emptyList()); 
} 

@Test(expected = IllegalArgumentException.class) 
public void shouldThrowExceptionWhenListIsBiggerThanTwo() { 
    doSomeStuff(Arrays.asList(new Object(), new Object(), new Object())); 
} 

Если одно ограничение меняется, вы меняете только один тест. Другой остается неизменным.

1

Вы должны создать два теста для конкретных ситуаций. В этом случае один для каждого исключения будет содержать чистые и понятные модульные тесты.

1

Я бы настоятельно рекомендую сценарии с одним путём для каждого метода для здравомыслительных целей (если у вас есть 17 исключений в одном тесте и этот тест не удается, вы можете проверить все 17 из этих возможностей), но вы также спросили, возможно. Конечно, вы можете использовать assert.fail с try/catch, если хотите собрать все вместе, где ожидаемое исключение пропускает оператор Fail.

@Test 
public void testDoSomeStuff() { 
    List<Object> objectList=new ArrayList<>(); 

    try { 
     doSomeStuff(objectList); 
     Assert.fail("Should throw IllegalArgumentException!"): 
    } 
    catch(IllegalArgumentException e) { 
     logger.info("Threw IllegalArgumentException as expected."); 
    } 

    objectList.add(new Object()); 
    objectList.add(new Object()); 
    objectList.add(new Object()); 

    try { 
     doSomeStuff(objectList); 
     Assert.fail("Should throw IllegalArgumentException!"): 
    } 
    catch(IllegalArgumentException e) { 
     logger.info("Threw IllegalArgumentException as expected."); 
    } 
} 
1

У вас может быть два метода испытаний и есть ожидание для каждого типа исключения на них. В вашем случае, я думаю, ваша логика нуждается только в одном исключении, потому что вы можете свернуть свои условия: if (objectList.isEmpty() || (objectList.size() >= 2)) ... затем проверьте на IllegalArgumentException с различными образцами.

С другой стороны, если вы действительно хотите иметь, что разделены, есть два метода с двумя ожидания: @Test(expected = IllegalArgumentException.class).

@Test(expected = IllegalArgumentException.class) 
public void doSomeStuff1() { 
    doSomeStuff(Collections.emptyList()); 
} 

@Test(expected = IllegalArgumentException.class) 
public void doSomeStuff2() { 
    List<Object> sample = new ArrayList<Object>(); 

    for (int i = 0; i < 5; i++) { // Change `5` for something else if you want 
    sample.add(new Object()); 
    } 
    doSomeStuff(sample); 
}