JUnit 测试:强制内部方法调用异常



我正在尝试编写一个测试用例,该用例涵盖了在catch块中编写的一段代码。事情是这样的:

我在类A中有两种方法。

class A{
     public SomeReturnType m1()
     {
       try{
            m2();
         }catch(SomeException ex)
         {
          //handler code for SomeException (This is what I want to test). 
         }
     }
     public SomeReturnType m2() throws SomeException
     {
            //Some logic
     }
}

我想知道当从方法 m1() 的单元测试用例调用m2()时如何强制此异常?使用Mockito或任何其他测试库的任何解决方案?

正如您所建议的,Mockito将是此类用例的经典工具:

// Initialization - should probably be in the @Before method:
A a = Mockito.spy(new A());
Mockito.doThrow(new SomeException("yay!")).when(a).m2();
// Actual test:
SomeResult actualResult = a.m1();
assertEquals(someExpectedResult, actualResult); // or some other assertion

上面的代码片段创建了一个spy ied 对象(将其视为扩展A的匿名类),其定义的行为是,当调用 m2() 时,将抛出SomeException。然后代码继续调用真正的m1()方法,该方法本身调用m2(),并且必须处理异常。

当然,

部分模拟可以解决您的问题,但设计本身存在一些缺陷。您的 API 提供了两种具有相同签名的方法,一种具有更丰富的异常管理功能。图案装饰器在这里似乎更优雅,不需要部分模拟来正确测试它。

如果你对重组这个类不感兴趣,最好的方法是使用部分模拟。存根 m2() 以在调用时抛出异常,然后调用 m1()。

使用 Mockito 模拟某些方法,但不能模拟其他方法

相关内容

  • 没有找到相关文章

最新更新