当前位置: 首页 > 知识库问答 >
问题:

Spock嘲弄-我的方法调用值不会被嘲弄

刘阳舒
2023-03-14

在helper类的静态方法中调用getMarkup()时,它会抛出一个NPE。我所做的是嘲笑MarkupMaker和它的返回值(一个Markup实例)。最后,我希望调用标记实例的toString()。无论我做什么-getMarkup()的调用都是抛出一个NPE。我找不到任何文档告诉我如何在spock中详细模拟方法调用值。

编辑:我添加了示例。maker.getMarkup()的调用返回null,即使我在spock测试中对其进行了嘲弄。

test.groovy

class TestExample extends Specification {

    @Shared
    MarkupMaker makerMock = Mock()
    @Shared
    MarkupObject markupMock = Mock()

    def setup() {
        markupMock.toString() >> "headline1"
        makerMock.getMarkup() >> markupMock
    }

    @Unroll
    def "Should return a Markupvalue #expectedvalue"(MarkupMaker helper, int tabElementIndex, String expectedValue) {
        expect:
        MarkupHelper.getMarkupForIndex(helper, tabElementIndex) == expectedValue
        where:
        helper    | tabElementIndex | expectedValue
        makerMock | 1               | "headline1"

    }

}

java(执行模拟对象的方法)

public class MarkupHelper {

  public static MarkupObject getMarkupForIndex(MarkupMaker maker, int index){
    if(index == 1){
      maker.getMarkup();
    }
    return null;
  }
}

java(被嘲弄的对象之一)

public class MarkupMaker {

  public MarkupObject getMarkup() {
    return new MarkupObject();
  }
}

markupObject.java(保存测试值的最后一个模拟对象)

public class MarkupObject {
  @Override
  public String toString() {
    return "headline1";
  }
}

共有2个答案

金飞
2023-03-14

在您提供的示例中,MarkupHelper将始终返回null。您只需调用maker.getMarkup()而不对其执行任何操作。因此执行将继续,返回null

Leonard的答案是正确的,因为您使用了@shared来获得模拟对象上的NPE,但是由于您的MarkupHelper实际上没有做您期望的事情,所以您的测试仍然不能满足。

类似地,您的MarkupObject mock正在拦截toString将无法工作,因为在您想要使用它的时候,它将在模拟之外,因此不会被使用。为了处理这个问题,您应该让您的MarkupHelper返回一个字符串,如下所示:

public static String getMarkupForIndex(MarkupMaker maker, int index){
    if(index == 1){
        return maker.getMarkup().toString();
    }
    return null;
}

如果您仍然希望您的MarkupHelper返回一个MarkupObject,那么在您的测试中,您将需要创建一个与实际的MarkupObject具有相同属性的预期MarkupObject。

佟阳飙
2023-03-14

删除模拟上的@shared,因为模拟不支持它。

 类似资料:
  • 正在测试的类: 下面是测试代码。我模拟了测试中的类class,并覆盖了方法getFruits的返回值。但是当我运行mock时,我没有得到预期的mock返回值。Easymock可以将返回值替换为被测试类的方法,如果这些方法是显式模拟的。当我模拟真实的对象方法时,如何获得模拟的返回值。

  • 我正在为类编写一个单元测试,该类如下所示: 我想编写一个简单的单元测试,它将方法存根(这样它就不会实际触发并命中数据库),但它允许我验证调用是否最终执行。Mockito似乎是这份工作的合适工具。 这似乎是一个很好的游戏计划(至少对我来说)。但当我实际编写代码时,在测试方法的第2行(行)出现以下编译器错误: 类型Mockito中的(T)不适用于参数(void)时的方法 我看到Mockito无法模拟返

  • 是否可以用Spock模拟java中的静态方法?我知道模拟静态groovy方法是可能的,但无法使其适用于Java方法。

  • 我遇到了一个挑战,当我单独运行测试时,测试通过了,但当我运行所有测试时,测试失败了,它会显示以下错误消息: java.lang.RuntimeException:Android.os.Looper中的方法getMainLooper未被嘲弄。详见http://g.co/androidstudio/not-mocked。 在Android.os.looper.GetMainLooper(looper.

  • 我需要测试一些遗留代码,这些代码在a方法调用中使用了单例。测试的目的是确保类sunder测试对singletons方法进行调用。我在SO上看到过类似的问题,但所有的答案都需要其他依赖项(不同的测试框架)--不幸的是,我仅限于使用Mockito和JUnit,但对于这样流行的框架,这应该是完全可能的。 单身人士: 正在测试的类: 单元测试: 这个想法是配置可怕的单例的预期行为,因为被测试的类将调用它的