我是JUnit的新手 . 我必须测试一个方法调用必须抛出异常并进入catch块的方法 . 我需要使用JUnit测试此流程 . 当我尝试 Mockito.when(method).thenThrow()
时,它不会抛出异常,并且流不会进入catch块 .
我的课程要测试:
public String exceptionMethod() {
String return = null;
ClassOne one = new ClassOne();
try {
//code
one.methodname(parameters); // this is a method which has to throw exception
return = happy path ;
//code
}
catch(Exception e){
return = exception ;
//code
}
}
JUnit类:
@Mock
Classone one = new Classone();
@Test(expected = RuntimeException.class)
public void testExceptionMethod(){
Mockito.when(one.method).thenThrow(new RuntimeException());
//code
String msg = exceptionMethod();
assertEquals(msg,"exception");
}
1 回答
你的代码很接近!你需要检查一些事情:
确保您在
@Before
方法中调用MockitoAnnotations.initMocks(this);,或者您正在使用MockitoJUnitRunner或MockitoRule . 这为Mockito提供了初始化@Mock
字段的机会 .确保您的类和方法符合模拟条件:既不是最终的也不是静态的 . 请务必查看Mockito limitations FAQ entry .
调用
new ClassOne()
是一个大问题,因为它确定你需要找到一种方法来确保你的模拟安装在被测系统中 . 一些想法:为测试中创建一个方法覆盖,该方法覆盖从您的测试中调用的ClassOne .
在被测系统上创建一个调用
new ClassOne()
的工厂方法,但可以在测试中重写以返回模拟 .预先创建ClassOne并将其保存到字段中,然后在测试中用模拟替换该字段 .