使用AWS SDK和Moq时无法对Mock's对象进行类型转换

本文关键字:对象 类型转换 Mock SDK AWS Moq 使用 | 更新日期: 2023-09-27 18:16:08

我正试图围绕一个服务编写单元测试,该服务将管理与各种SQS队列的通信。我无法将IAmazonSQS的mock版本注入到我的类中。我有以下构造函数:

private AmazonSQSClient client;
public SqsQueue(IAmazonSQS client, string queueUrl)
{
    this.client = (AmazonSQSClient)client;
    this.queueUrl = queueUrl;
}

问题行是分配给这个client的。我得到了这个异常:Additional information: Unable to cast object of type 'Castle.Proxies.IAmazonSQSProxy' to type 'Amazon.SQS.AmazonSQSClient'.当我把这行改成:

this.client = client as AmazonSQSClient;

客户端设置为空。这是相关的单元测试代码:
public void Setup()
{
    this.mockClient = new Mock<IAmazonSQS>();
    this.queueUrl = "testUrl";
}
public void GetMessageCount_WhenMessagesExist_ReturnsCount()
{
    // Arrange
    var sqsQueue = new SqsQueue<IMessage>(this.mockClient.Object, this.queueUrl); // Calls into the constructor above.
} 

我错过了什么明显的东西吗?

使用AWS SDK和Moq时无法对Mock's对象进行类型转换

我知道你是自己回答的,但我想我也应该给出我的答案。

问题在于构造函数接受一个接口,然后将该接口强制转换为一个离散类。虽然这适用于正常操作,但它在单元测试中不起作用,因为您的实际离散类是而不是AmazonSQSClient,并且与它没有关系。AmazonSQSClient和模拟对象之间的唯一共同点是它们都实现了IAmazonSQS接口。

要使用Amazon客户端,所需要的只是接口。因此,将成员变量更改为接口,并避免强制类型转换:

private IAmazonSQS client;
public SqsQueue(IAmazonSQS client, string queueUrl)
{
    this.client = client;
    this.queueUrl = queueUrl;
}

我认为问题出在类型转换本身。我改变了我的类有private IAmazonSQS client而不是private AmazonSQSClient client。这消除了有问题的类型转换的必要性,并允许测试运行。

相关文章: