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

时间:2015-02-03 19:18:18

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

我正在尝试编写一个测试用例,其中包含在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
     }
}

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

3 个答案:

答案 0 :(得分:3)

如你所知,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对象(将其视为一个扩展A的匿名类),其中定义的行为是m2()被调用时SomeException将被抛出。 然后代码继续调用真正的m1()方法,该方法本身调用m2(),并且必须处理异常。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

Use Mockito to mock some methods but not others