4

我正在使用 EasyMock 创建一些 junit 测试用例。到目前为止,我期望返回 POJO 的类是有意义的,但是我应该如何处理本身可能引发异常的 DAO 对象。我的测试用例是检查 DAO 遇到问题时抛出的预期异常。使用 EasyMock 我尝试模拟 DAO 对象(从foo类测试),处理较低级别 DAO 异常的正确方法是什么。

下面是类/简单调用的示例:(假设所有 getter/setter/constructor 都有效且存在)

public class foo{
    private daoClass dao = daoClass.getInstance();
    public String getValueFromDB(String key) throws DBException{
        return dao.lookup(key);
    }
}

public class daoClass{ //singleton DAO 
    public daoClass getInstance(){
       //singleton access here
    }
    public String lookup(String key) throws DBException{
        try{
            //DB LOGIC
        }
        catch(Exception e){
            throw new DBException(e.getMessage());
        }
    }
}

当我尝试测试这个foo类时,我希望能够测试这个 DBException。我该如何处理这个问题,我应该在 try/catch 中(在测试中)包围 DAO 调用,还是在测试中添加 throws?我知道expected=DBException如果抛出它会通过测试,但是你应该如何在语法上处理任意数量的内部异常?

测试代码示例:

@Test(expected=DBException.class)
public void testFooError(){
    String key = "test";
    String value = "expected";
    daoClass daoMock = createMock(daoClass.class);
    try{
        expect(daoMock.lookup(key)).andReturn(value);
    } catch (DBException e){
        // ???
    }
}

expect可能引发错误时,正确的处理方法是什么?测试方法throw应该例外,还是应该try/catch使用?expected=EXCEPTION在测试中使用标签仍然正确吗?

4

2 回答 2

7

以下是我在单元测试中处理异常的方式:

如果您没有显式测试异常,那么您应该在方法中添加一个 throws 子句 - 如果抛出异常并且您不希望它被抛出,那么这是一个测试失败。例如,

@Test
public void testFooNormal() throws DBException{
    String key = "test";
    String value = "expected";
    daoClass daoMock = createMock(daoClass.class);
    expect(daoMock.lookup(key)).andReturn(value);
    // do an assert on returned value
    ...
}

如果您正在显式测试异常,则在您期望它被抛出的行周围放置一个 try-catch(捕获您期望的最窄版本的异常),然后在 catch 子句中设置一个布尔值,并且断言应该打开布尔值。例如,

@Test
public void testFooError(){
    String key = "test";
    String value = "expected";
    boolean exceptionThrown = false;
    daoClass daoMock = createMock(daoClass.class);
    try{
      expect(daoMock.lookup(key)).andReturn(value);
    }catch (DBException e) {
      exceptionThrown = true;
    }
    // assert exceptionThrown is true
    ...
}

这是测试异常的好方法,因为这意味着您不仅要测试是否抛出了正确的异常,还要测试它是否完全从您期望的行中抛出。如果您使用 @test(expected=...) 则测试中的不同行可能会引发该异常并且测试可能会错误地通过。

于 2013-03-01T16:51:58.977 回答
3

您的 DAO 逻辑不应根据您的测试而改变。如果您希望您的 DAO 抛出异常,请保持这种状态并以您正在测试的方式测试异常。

如果您在 DAO 本身中捕获异常以进行回滚或日志记录等,那么测试用例不应期望出现异常,因为它不是测试用例场景。在这种情况下,您可以检查 NULL ,因为我希望您的 DAO 将返回 NULL 。

于 2013-03-01T16:41:10.050 回答