【问题标题】:JUnit Test : Forcing exception from internal method callJUnit Test:从内部方法调用中强制异常
【发布时间】:2015-02-03 19:18:18
【问题描述】:

我正在尝试编写一个测试用例,它涵盖了在 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 或任何其他测试库的解决方案?

【问题讨论】:

    标签: java unit-testing junit mockito spring-test


    【解决方案1】:

    正如您所建议的,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
    

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

    【讨论】:

    • 我想我这里没有调用 m1() 方法,那么 catch 块中的代码将如何呈现......你能详细说明一下吗?
    • @DanglingPiyush 我在答案中添加了一些细节 - 如果这不是您想要的,请告诉我。
    • m1 正在调用 m2,反之亦然?
    • @DanglingPiyush 是的,确实,我切换了m1m2。过失。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      Use Mockito to mock some methods but not others

      【讨论】:

        猜你喜欢
        • 2021-07-17
        • 1970-01-01
        • 2020-09-12
        • 1970-01-01
        • 1970-01-01
        • 2019-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多