2013-04-27 82 views
3

我有一个用例,我试图确保在我的类中调用特定方法时引发了抽象异常。使用Mockito是否可以抛出抽象异常?

我使用的Mockito要做到这一点,但已经注意到,是的Mockito根本就没有抛出异常被调用方法时。

类来进行测试:

public void doSomething() throws CustomException { 
    try { 
    Collection<T> results = dao.getDatabaseResults(); 
     } catch (ProblemException e) { 
      throw new CustomException("There was an exception", e); 
    } 
} 

问题Exception类:

public abstract class ProblemException extends RuntimeException { 

    public ProblemException(String message) { 
     super(message); 
    } 

    public ProblemException(String message, Throwable e) { 
     super(message, e); 
    } 

测试类:

public testDoSomething() throws Exception { 
    CustomDAO mockDAO = Mockito.mock(CustomDAO.class); 

    Mockito.when(mockDAO.getDatabaseResults()).thenThrow(new ProblemException); 

    try { 
     foo.doSomething(); 
     Assert.fail(); 
    } catch (CustomException e) { 
     //Some more asserts 
    } 

目前上述测试类不能编译,因为你可以”创建一个抽象类的新实例。

我没有获得改变AbstractException类,我也不能更改由getDatabaseResults在DAO类()方法抛出的异常类型。

你对这个问题的干净的解决方案有什么建议?

有一件事我能想到的是赶上我的doSomething()方法中的一个RuntimeException(如ProblemException扩展此类)。我只是好奇,如果有更好的方法?

感谢

回答

8

不能直接实例化一个抽象类,但你可以很容易地实例化一个匿名子类,因为你不会被强迫定义任何方法这就是在这种情况下很简单:

Mockito.when(mockDAO.getDatabaseResults()).thenThrow(new ProblemException(){}); 

或者,你可以用另一种模拟:

Mockito.when(mockDAO.getDatabaseResults()).thenThrow(Mockito.mock(ProblemException.class)); 

这将使意义,如果抽象类强制的其他方法,你的定义d不关心你的测试。

+0

非常好,非常感谢。不敢相信我之前没有想过这样做!我认为我可能会采用第二个建议,以保护自己免受抽象类未来在某个时间添加其他方法的机会。 – JoshDavies 2013-04-27 14:53:40

+0

我的确认为'thenThrow'也接受一个类。所以'Mockito.when(mockDAO.getDatabaseResults())。ThenThrow(ProblemException.class);' – bowmore 2013-04-28 08:31:00