JUnit异常测试

Ins*_*ere 15 java junit unit-testing exception junit3

编辑:目前不提供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());
        }

    }
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我需要为每个应该抛出异常的函数提供一个try/catch块.这似乎不是一个好方法 - 或者是否没有可能减少try/catch的使用?

ska*_*man 33

我建议你需要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());
}
}
Run Code Online (Sandbox Code Playgroud)

  • @InsertNickHere:你的谨慎是值得称道的,但我建议在这种情况下放错位置.JUnit4可以无需更改即可运行JUnit3样式的测试,允许您逐步迁移一个测试.此外,JUnit4现在已经有4年了,现在是你搬家的时候了. (5认同)

Don*_*ows 13

如果你有一个预期的异常并且你不能使用注释来捕获它,你需要捕获它并断言你已经得到了你所期望的.例如:

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

如果您可以使用注释,请执行此操作,因为它更清晰.但这并不总是可行的(例如,因为您正在测试一系列方法或因为您正在使用JUnit 3).