Тестирование исключения JUnit

Править: Не JUnit 4, доступный в это время.

Привет там,

У меня есть вопрос об "умном" тестировании исключения с JUnit. В это время я делаю это как это:

public void testGet() {

    SoundFileManager sfm = new SoundFileManager();

        // Test adding a sound file and then getting it by id and name.
        try {
            SoundFile addedFile = sfm.addSoundfile("E:\\Eclipse_Prj\\pSound\\data\\Adrenaline01.wav");
            SoundFile sf = sfm.getSoundfile(addedFile.getID());
            assertTrue(sf!=null);
            System.out.println(sf.toString());

            sf = sfm.getSoundfileByName("E:\\Eclipse_Prj\\pSound\\data\\Adrenaline01.wav");
            assertTrue(sf!=null);
            System.out.println(sf.toString());
        } catch (RapsManagerException e) {
            System.out.println(e.getMessage());
        }

        // Test get with invalid id. 
        try {
            sfm.getSoundfile(-100);
            fail("Should have raised a RapsManagerException");
        } catch (RapsManagerException e) {
            System.out.println(e.getMessage());
        }

        // Test get by name with invalid name
        try {
            sfm.getSoundfileByName(new String());
            fail("Should have raised a RapsManagerException");
        } catch (RapsManagerException e) {
            System.out.println(e.getMessage());
        }

    }

Как Вы видите, мне нужен один блок попытки/выгоды для каждой функции, которая, как предполагается, выдает исключение. Это, кажется, не хороший способ сделать это - или не является там никакой возможностью уменьшить использование попытки/выгоды?

15
задан Joachim Sauer 21 June 2010 в 09:14
поделиться

3 ответа

Я предлагаю вам разбить testGet на несколько отдельных тестов. Отдельные блоки try / catch кажутся довольно независимыми друг от друга. Вы также можете извлечь общую логику инициализации в собственный метод настройки.

Как только у вас есть это, вы можете использовать поддержку аннотаций исключений JUnit4, примерно так:

public class MyTest {

private SoundManager sfm;

@Before
public void setup() {
      sfm = new SoundFileManager();
}

@Test
public void getByIdAndName() {
  // Test adding a sound file and then getting it by id and name.
      SoundFile addedFile =              
      sfm.addSoundfile("E:\\Eclipse_Prj\\pSound\\data\\Adrenaline01.wav");
      SoundFile sf = sfm.getSoundfile(addedFile.getID());
      assertTrue(sf!=null);
      System.out.println(sf.toString());

      sf = sfm.getSoundfileByName("E:\\Eclipse_Prj\\pSound\\data\\Adrenaline01.wav");
      assertTrue(sf!=null);
      System.out.println(sf.toString());
}

@Test(expected=RapsManagerException.class)
public void getByInvalidId() {
      // Test get with invalid id. 
      sfm.getSoundfile(-100);
}

@Test(expected=RapsManagerException.class)
public void getByInvalidName() {
      // Test get with invalid id. 
      sfm.getSoundfileByName(new String());
}
}
33
ответ дан 1 December 2019 в 00:16
поделиться

Если у вас есть ожидаемое исключение и вы не можете использовать аннотацию для его перехвата, вам нужно перехватить его и подтвердить, что вы получили то, что ожидали. Например:

Throwable caught = null;
try {
   somethingThatThrows();
} catch (Throwable t) {
   caught = t;
}
assertNotNull(caught);
assertSame(FooException.class, caught.getClass());

Если вместо этого вы можете использовать аннотацию, сделайте это, так как она намного понятнее. Но это не всегда возможно (например, потому что вы тестируете последовательность методов или потому что используете JUnit 3).

13
ответ дан 1 December 2019 в 00:16
поделиться

Вместо этого в JUnit 4 вы можете использовать аннотации. Тем не менее, вы должны разделить свой тест на 3 различных метода, чтобы это работало чисто. Примечание что ИМХО перехват исключения в первом сценарии должен быть ошибкой, поэтому я соответствующим образом изменил блок catch .

public void testGet() {
    SoundFileManager sfm = new SoundFileManager();

    // Test adding a sound file and then getting it by id and name.
    try {
        SoundFile addedFile = sfm.addSoundfile("E:\\Eclipse_Prj\\pSound\\data\\Adrenaline01.wav");
        SoundFile sf = sfm.getSoundfile(addedFile.getID());
        assertTrue(sf!=null);
        System.out.println(sf.toString());

        sf = sfm.getSoundfileByName("E:\\Eclipse_Prj\\pSound\\data\\Adrenaline01.wav");
        assertTrue(sf!=null);
        System.out.println(sf.toString());
    } catch (RapsManagerException e) {
        fail(e.getMessage());
    }
}

@Test(expected=RapsManagerException.class)
public void testGetWithInvalidId() {
    SoundFileManager sfm = new SoundFileManager();

    sfm.getSoundfile(-100);
}

@Test(expected=RapsManagerException.class)
public void testGetWithInvalidName() {
    SoundFileManager sfm = new SoundFileManager();

    sfm.getSoundfileByName(new String());
}
3
ответ дан 1 December 2019 в 00:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: