Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JUnit测试:从内部方法调用强制执行异常_Java_Unit Testing_Junit_Mockito_Spring Test - Fatal编程技术网

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

Java JUnit测试:从内部方法调用强制执行异常,java,unit-testing,junit,mockito,spring-test,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).

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

如果您对重构此类不感兴趣,最好的方法是使用部分mock。Stub out m2()在调用时抛出异常,然后调用m1()


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

然后代码继续调用real
m1()
方法,该方法本身调用
m2()
,并且必须处理异常。

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

我想这里我不是在调用m1()方法,那么catch块中的代码将如何进入图片中……您能详细说明一下吗?@danglingpiyus我在答案中添加了一些细节-如果这不是您想要的,请告诉我。m1正在调用m2,而不是相反?@danglingpiyus是的,确实,我切换了
m1
m2
。我有罪。