java - mockito 中的部分模拟 - 强制方法进入异常并继续

标签 java junit mockito

我有一个带有一些逻辑和异常 block 的方法,并且想测试异常 block 中的内容。

方法:

Class Validator() {

    protected Validator(blah,blah) {

    }

    protected boolean doStuff(String a, String b) {

        try {
          isValidInput(a){
        } catch (Exception e) {
            b = "unknown error"
        }
    }

测试用例:

@Test
public void testException() {

Validator testValidator = new testValidator(blah, blah);

        Validator spy = spy(testValidator);
        String var2 = "unknown error"
        doReturn(new Exception()).when(spy.doStuff(var1, var2));

        assertEquals("unknown error", var2);
}

如何强制真正的方法进入异常 block 并继续 stub ?

最佳答案

首先,忘记使用spy - 如果isValidInput能够抛出异常,那么让它抛出异常

如果在 isValidInput() 中使用的协作者可以抛出 Exception,则使用 Mockito 模拟。如果这只是您的代码,那么您应该能够设置 a 以便生成异常。

您仍然需要在 isValidInput() 上编写一整套测试 - 使用 @Test 注释中的 expected 选项进行调查(我假设您正在使用 JUnit此处)指定抛出异常是测试的预期结果。但请不要抛出 Exception - 使用它的有意义的子类:-)

正如 @Dave Newton 评论的那样,测试 var2 永远不会在 doStuff 的范围之外工作。

关于java - mockito 中的部分模拟 - 强制方法进入异常并继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8087516/

相关文章:

java - RandomAccessFile 对象的奇怪行为

java - 如何找出模板变量的哪些属性是可调用的

java - 用户输入的 SQL 注入(inject)问题

java - 使用 powerMockito 在 Runnable 中模拟 new()

java - keystore 加载

java - 无法在 @Test Junit Selenium Web 驱动程序中使用定位器

java - Spring-Test-Mvc Controller 测试

java - 如何在并行运行之前初始化 JUnit 测试类

spring - 当 Cucumber 与 Mockito 一起使用时,模拟对象不会被注入(inject)到服务类中

java - PowerMockito.doReturn 返回 null