【问题标题】:Mock base class method with Easymock使用 Easymock 模拟基类方法
【发布时间】:2017-09-18 16:01:41
【问题描述】:

我有以下测试代码:

    herder = PowerMock.createPartialMock(DistributedHerder.class, new String[]{"backoff", "updateDeletedConnectorStatus"},
            new DistributedConfig(HERDER_CONFIG), worker, WORKER_ID, statusBackingStore, configBackingStore, member, MEMBER_URL, time);

    configUpdateListener = herder.new ConfigUpdateListener();
    rebalanceListener = herder.new RebalanceListener();
    plugins = PowerMock.createMock(Plugins.class);
    EasyMock.expect(worker.getPlugins()).andReturn(plugins);
    EasyMock.expect(herder.connectorType(CONN1)).andReturn(ConnectorType.SOURCE).anyTimes();

connectorType() 方法在 DistributedHerder 的基类 AbstractHerder 中定义。 由于 herder 是从 DistributedHerder 创建的,easy mock 找不到 AbstractHerder 类的 mock,导致 NPE:

org.apache.kafka.connect.runtime.distributed.DistributedHerderTest > testInconsistentConfigs FAILED
  java.lang.NullPointerException
    at org.apache.kafka.connect.runtime.AbstractHerder.getConnector(AbstractHerder.java:342)
    at org.apache.kafka.connect.runtime.distributed.DistributedHerder$$EnhancerByCGLIB$$af0dd240.CGLIB$getConnector$39(<generated>)
    at org.apache.kafka.connect.runtime.distributed.DistributedHerder$$EnhancerByCGLIB$$af0dd240$$FastClassByCGLIB$$8c31132d.invoke(<generated>)
    at org.easymock.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
    at org.easymock.internal.ClassProxyFactory$MockMethodInterceptor.intercept(ClassProxyFactory.java:92)
    at org.apache.kafka.connect.runtime.distributed.DistributedHerder$$EnhancerByCGLIB$$af0dd240.getConnector(<generated>)
    at org.apache.kafka.connect.runtime.AbstractHerder.connectorType(AbstractHerder.java:349)
    at org.apache.kafka.connect.runtime.distributed.DistributedHerder$$EnhancerByCGLIB$$af0dd240.CGLIB$connectorType$23(<generated>)
    at org.apache.kafka.connect.runtime.distributed.DistributedHerder$$EnhancerByCGLIB$$af0dd240$$FastClassByCGLIB$$8c31132d.invoke(<generated>)
    at org.easymock.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
    at org.easymock.internal.ClassProxyFactory$MockMethodInterceptor.intercept(ClassProxyFactory.java:92)
    at org.apache.kafka.connect.runtime.distributed.DistributedHerder$$EnhancerByCGLIB$$af0dd240.connectorType(<generated>)
    at org.apache.kafka.connect.runtime.distributed.DistributedHerderTest.setUp(DistributedHerderTest.java:179)

欢迎任何提示。

【问题讨论】:

  • 你在哪里打电话给replyherder

标签: java unit-testing easymock


【解决方案1】:

我在这里有点迷路,但仍会尝试就苏格拉底问题给出一些提示。

  • 为什么DistributedHerder 需要 PowerMock?它看起来像一个正常的部分模拟
  • 为什么用 PowerMock 代替 Plugins 而不是普通的 EasyMock?
  • 您是否配置了 PowerMock 运行器?
  • 什么是herder.new ConfigUpdateListener()?那是什么语言?
  • 什么是worker
  • 我确实看不到replay()。能有完整的代码吗?
  • 没有为backoffupdateDeletedConnectorStatus 记录任何内容。这正常吗?
  • 在您的情况下,plugins() 方法似乎返回 null。这个没有被嘲笑,所以它可能只是返回 null 确实没有?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多