【问题标题】:Unable to set values when I Moq Confluent.Kafka.WatermarkOffsets当我 Moq Confluent.Kafka.WatermarkOffsets 时无法设置值
【发布时间】:2023-03-12 05:53:01
【问题描述】:

我在模拟Confluent.Kafka.WatermarkOffsets.Net 测试中有这个Moq

Mock<WatermarkOffsets> _mockWatermarkOffsets = new Mock<WatermarkOffsets>();

在我的一项测试中,我想设置一个高值和低值,因此尝试了以下操作:

我试过_mockWatermarkOffsets.Object.Low = 1_mockWatermarkOffsets.Object.Low = 10,但似乎无法设置:

获取主题/分区中最早消息的偏移量。如果没有消息写入主题,则低水位偏移设置为 0。如果已将一条消息写入分区(偏移为 0),低水位也将为 0。

CS0200:属性或索引器无法分配给“--”,它是只读的

有什么办法可以做到吗?

【问题讨论】:

  • 抱歉。已更新。
  • 你不能只实例化一个WatermarkOffsets吗?是否有实际模拟它的特定需求?
  • 无需模拟WatermarkOffsets。如果使用实际实例没有负面影响,请使用它。

标签: c# .net unit-testing moq


【解决方案1】:

要模拟属性 getter,您需要在模拟对象中使用 Setup/SetupGet 方法:

_mockWatermarkOffsets.SetupGet(m => m.Low).Returns(1); // Preferable, to express your intent
_mockWatermarkOffsets.Setup(m => m.Low).Returns(1);

但是,您不能模拟WatermarkOffsets.Low,因为它没有标记为virtual,因此Moq 不能覆盖它。

另一件会妨碍你模拟的事情是WatermarkOffsets 不包含无参数构造函数。一种解决方法是使用以下(丑陋的)构造来构建您的模拟:

var parameters = new object[] { new Offset(1), new Offset(10) };
var mock = new Mock<WatermarkOffsets>(parameters);

我的建议是,您最好的选择是简单地使用WatermarkOffsets 实例,正如Riwen 所建议的那样

【讨论】:

    猜你喜欢
    • 2015-12-14
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多