EasyMock异常处理

时间:2013-03-01 16:29:45

标签: java junit easymock

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

类/简单调用的一个示例如下:(假设所有getter / setters /构造函数都有效且存在)

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调用,或者在测试中添加一个抛出,我该如何处理?我知道如果抛出测试,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标记是否仍然正确?

2 个答案:

答案 0 :(得分:5)

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

如果你没有显式地测试异常那么你应该在方法中添加一个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(捕获你期望的Exception的最窄版本),然后设置一个布尔值在catch子句中,assert应该是boolean的值。 如,

@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 = ...),那么测试中的另一行可能会抛出该异常,并且测试可能会错误地传递。

答案 1 :(得分:3)

您的DAO逻辑不应根据您的测试进行更改。如果您希望DAO抛出异常,那就保持这种方式并以您测试的方式测试Exception。

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