JUnit 测试:从内部方法调用强制异常
JUnit Test : Forcing exception from internal method call
我正在尝试编写一个测试用例,它涵盖了 catch
块中编写的一段代码。事情是这样的:
我在classA
中有两个方法。
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 或任何其他测试库的任何解决方案?
如果您对重组此 class 不感兴趣,最好的方法是使用部分模拟。 Stub out m2() 调用时抛出异常,然后调用m1()。
Use Mockito to mock some methods but not others
正如您所建议的那样,Mockito 将是用于此类用例的 classic 工具:
// 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
的匿名 class),并具有调用 m2()
时定义的行为,将抛出 SomeException
。
然后代码继续调用真正的 m1()
方法,它本身调用 m2()
,并且必须处理异常。
当然部分模拟可以解决你的问题,但设计本身存在一些缺陷。您的 API 提供了两种具有相同签名的方法,一种具有更丰富的异常管理功能。模式装饰器在这里似乎更优雅,不需要部分模拟来正确测试它。
我正在尝试编写一个测试用例,它涵盖了 catch
块中编写的一段代码。事情是这样的:
我在classA
中有两个方法。
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 或任何其他测试库的任何解决方案?
如果您对重组此 class 不感兴趣,最好的方法是使用部分模拟。 Stub out m2() 调用时抛出异常,然后调用m1()。
Use Mockito to mock some methods but not others
正如您所建议的那样,Mockito 将是用于此类用例的 classic 工具:
// 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
的匿名 class),并具有调用 m2()
时定义的行为,将抛出 SomeException
。
然后代码继续调用真正的 m1()
方法,它本身调用 m2()
,并且必须处理异常。
当然部分模拟可以解决你的问题,但设计本身存在一些缺陷。您的 API 提供了两种具有相同签名的方法,一种具有更丰富的异常管理功能。模式装饰器在这里似乎更优雅,不需要部分模拟来正确测试它。