我正在编写一个测试(groovy language \ spock framework,如果相关的话)
最初,它使我们的应用程序向特定交换机(相关的办公室365)邮箱发送电子邮件。之后,我需要登录该邮箱并验证应用程序已发送的电子邮件。
我使用EWS Java API与EWS通信(com.microsoft.ews-java-api 2.0)
连接到Exchange服务后,我执行以下操作:
SearchFilter searchFilter = new SearchFilter.ContainsSubstring(EmailMessageSchema.Body, "search string")
Awaitility.await()
.atMost(180, TimeUnit.SECONDS)
.until({
exchangeService.findItems(WellKnownFolderName.Inbox, searchFilter, new ItemView(1)).totalCount > 0
})
Awaitility.await()在这里基本上是一个动态等待 - 它会重试代码,直到满足条件。它可以被任何类型的循环替换,具有线程休眠和中断条件。
在第一次尝试时,findItems调用永远不会找到该电子邮件 - 通常需要大约一分钟才能发送电子邮件到达。
问题是,在任何后续尝试中,findItems都无法成功找到该项。但是,如果我在它上面有一个断点,直到我看到邮箱中的电子邮件 - 它成功运行。
所以对我而言,一旦搜索失败(找不到任何东西),再次执行该方法就不会做任何事情。我做错了什么?
答案 0 :(得分:0)
我建议您在进行FindItem调用之间进行休眠,因为您没有在服务器上给出限制,以便在后续调用之间进行更新。此外,您的SearchFilter是非常耗费资源的,因为它执行Message主体的子串。如果您想跟踪消息的传递,为什么不在发送消息Internet Message ID FROM EWS Managed API Send Email c#时设置InternetMessageId,然后创建一个仅查找具有该Id的消息的SearchFilter。