首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JUnit异常测试

JUnit异常测试
EN

Stack Overflow用户
提问于 2010-06-21 16:46:13
回答 5查看 53.5K关注 0票数 15

编辑: JUnit 4暂时不可用。

你好啊,

我有一个关于JUnit的“智能”异常测试的问题。在这个时候,我这样做:

代码语言:javascript
复制
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());
        }

    }

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-06-21 16:54:46

我建议您需要将testGet分解为多个单独的测试。各个try/catch块似乎彼此非常独立。您可能还希望将公共初始化逻辑提取到它自己的设置方法中。

一旦你有了它,你就可以使用JUnit4的异常注释支持,如下所示:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2010-06-21 16:52:43

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

代码语言:javascript
复制
Throwable caught = null;
try {
   somethingThatThrows();
} catch (Throwable t) {
   caught = t;
}
assertNotNull(caught);
assertSame(FooException.class, caught.getClass());

如果您可以使用注释来代替,那么这样做会更清楚。但这并不总是可能的(例如,因为您正在测试一系列方法,或者因为您正在使用JUnit 3)。

票数 13
EN

Stack Overflow用户

发布于 2010-06-21 16:48:14

在JUnit 4中,您可以使用注释。然而,你应该将你的测试分成3个不同的方法,这样才能干净利落地工作。注意,IMHO在第一个场景中捕获异常应该是失败的,因此我相应地修改了catch块。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3083161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档