java - 如何在单元测试中模拟 AmazonSQS 而不调用 SQS?

标签 java amazon-web-services mockito testng amazon-sqs

我的 Java 中有以下方法类(class):

public class AwsHelper {

  private AmazonSQS sqs;

  private void sendMessageToQueue(String message){

        sqs = AmazonSQSClientBuilder.defaultClient();

        SendMessageRequest sendMessageRequest = new SendMessageRequest();
        sendMessageRequest.setQueueUrl("");
        sendMessageRequest.setMessageBody(message);
        sendMessageRequest.setMessageGroupId("");

        sqs.sendMessage(sendMessageRequest);
}
我希望能够模拟 sqs.sendMessage(sendMessageRequest); 的行为这样我的单元测试就不会向队列发送消息。
我在我的测试课中尝试这样做,但是 sqs当我的测试执行时,实际上会向队列发送一条消息。假设这是由 AmazonSQSClientBuilder.defaultClient() 分配的.
我该如何解决这个问题?
public class AwsSQSReferralsUtilTest {
    
        @Spy
        @InjectMocks
        private AwsHelper awsHelper;
    
        @Mock
        AmazonSQS sqs;
    
        @BeforeClass
        public void setUp() {
            MockitoAnnotations.initMocks(this);
        }
    
        @AfterMethod
        public void afterEachMethod() {
            Mockito.reset(awsHelper);
        }
    
        @Test
        public void shouldSendMessage() {
    
            Mockito.when((sqs.sendMessage(any(SendMessageRequest.class)))).thenReturn(new SendMessageResult());
    
            awsHelper.sendMessageToQueue("");
        }
}

最佳答案

我建议使用文章中的方法:https://github.com/mockito/mockito/wiki/Mocking-Object-Creation
您需要稍微更改一个类,以以下方式应用文章中的模拟方法:
AwsHelper

public class AwsHelper {

    private AmazonSQS sqs;

    public void sendMessageToQueue(String message) {
        sqs = defaultClient();

        SendMessageRequest sendMessageRequest = new SendMessageRequest();
        sendMessageRequest.setQueueUrl("");
        sendMessageRequest.setMessageBody(message);
        sendMessageRequest.setMessageGroupId("");

        sqs.sendMessage(sendMessageRequest);
    }

    protected AmazonSQS defaultClient() {
        return AmazonSQSClientBuilder.defaultClient();
    }
}

AwsSQSReferralsUtilTest
public class AwsSQSReferralsUtilTest {

    @Spy
    private AwsHelper awsHelper;

    @Mock
    private AmazonSQS sqs;

    @BeforeClass
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }
    
    @AfterMethod
    public void afterEachMethod() {
        Mockito.reset(awsHelper);
    }

    @Test
    public void shouldSendMessage() {
        //mocking object creation
        doReturn(sqs).when(awsHelper).defaultClient();

        when(sqs.sendMessage(any(SendMessageRequest.class))).thenReturn(new SendMessageRequest());
        awsHelper.sendMessageToQueue("");
    }

}

关于java - 如何在单元测试中模拟 AmazonSQS 而不调用 SQS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65956878/

相关文章:

java - JAXB 继承,解码到编码类的子类

java - 使用 Spring mvc 无法在 Tomcat 和 nginx proxypass 中保持 Http session

java - 模拟方法返回带有参数之一

使用 Mockito 进行 Java 单元测试。函数内的函数调用

java - 任何模拟 Files.write(...) 方法的方法?

模拟 ObjectMapper 时出现 java.lang.VerifyError

java - XML解析后Element Node对象转换为Text Node

amazon-web-services - AWS RDS : FATAL: password authentication failed for user "postgres"

amazon-web-services - 归档到亚马逊 AWS 的冰川存储并从中检索

amazon-web-services - 如何在AWS中为两个CloudFront设置金丝雀版本?