基于Mockito的Selenium Fluent Wait测试及文件下载等待方法问询
Mockito测试用例:针对Selenium Fluent Wait的文件下载等待方法
没问题,我来帮你写针对这个文件下载等待方法的Mockito测试用例。首先咱们得梳理清楚这个方法里的核心依赖和分支逻辑:
- 需要mock静态类
Configuration的getOption方法,用来返回不同的浏览器名称 - 需要mock当前类的
getWebDriverFluentWait方法,毕竟我们不需要实际执行FluentWait的等待逻辑,只需要验证它被正确调用 - 方法里有个关键分支:Firefox浏览器会给文件路径追加
.part后缀,这个是测试的核心覆盖点
先看测试需要的依赖导入,然后分场景写测试用例:
测试依赖准备
确保你的测试类引入这些必要的包:
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.MockedStatic; import org.mockito.junit.jupiter.MockitoExtension; import org.openqa.selenium.WebDriver; import org.openqa.selenium.support.ui.FluentWait; import java.io.File; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.*;
测试类结构与场景1:非Firefox浏览器
这个场景下,文件路径不会被修改,我们要验证路径处理正确,并且依赖方法被正确调用:
@ExtendWith(MockitoExtension.class) class FileDownloadWaitTest { @Mock private WebDriver mockDriver; @Mock private FluentWait<WebDriver> mockFluentWait; // 假设你的方法所在的类是FileDownloadHelper,这里实例化它 private final FileDownloadHelper downloadHelper = new FileDownloadHelper(); @Test void waitForFileDownload_WhenNonFirefoxBrowser_UsesOriginalFilePath() { String testFilePath = "/tmp/sample-report.pdf"; int timeoutMillis = 10000; // Mock Configuration静态类的getOption方法,返回Chrome浏览器 try (MockedStatic<Configuration> mockedConfig = mockStatic(Configuration.class)) { mockedConfig.when(() -> Configuration.getOption(Constants.Browser)) .thenReturn(BrowserName.CHROME.getValue()); // Spy当前类,用来mock getWebDriverFluentWait方法,避免实际创建FluentWait实例 FileDownloadHelper spyHelper = spy(downloadHelper); doReturn(mockFluentWait).when(spyHelper).getWebDriverFluentWait(timeoutMillis); // 执行待测试的方法 spyHelper.waitForFileDownload(timeoutMillis, testFilePath); // 验证Configuration的方法被正确调用 mockedConfig.verify(() -> Configuration.getOption(Constants.Browser)); // 验证getWebDriverFluentWait传入了正确的超时时间 verify(spyHelper).getWebDriverFluentWait(timeoutMillis); // 如果你的原方法后续补充了FluentWait的等待逻辑(比如判断文件存在),还可以验证mockFluentWait的until方法 // 比如:verify(mockFluentWait).until(any(Predicate.class)); } }
场景2:Firefox浏览器
这个场景要重点验证文件路径被追加了.part后缀:
@Test void waitForFileDownload_WhenFirefoxBrowser_AppendsPartSuffix() { String testFilePath = "/tmp/sample-report.pdf"; int timeoutMillis = 15000; String expectedFilePath = testFilePath + ".part"; try (MockedStatic<Configuration> mockedConfig = mockStatic(Configuration.class)) { mockedConfig.when(() -> Configuration.getOption(Constants.Browser)) .thenReturn(BrowserName.FIREFOX.getValue()); FileDownloadHelper spyHelper = spy(downloadHelper); doReturn(mockFluentWait).when(spyHelper).getWebDriverFluentWait(timeoutMillis); spyHelper.waitForFileDownload(timeoutMillis, testFilePath); mockedConfig.verify(() -> Configuration.getOption(Constants.Browser)); verify(spyHelper).getWebDriverFluentWait(timeoutMillis); // 这里可以进一步验证FluentWait等待的是后缀后的文件(如果原方法有相关逻辑) // 比如通过argThat来匹配Predicate,确认它检查的是expectedFilePath对应的文件 } } }
关键注意点
- 用
MockedStatic来mock静态类Configuration,保证每个测试的隔离性,不会影响其他测试 - 使用
spy而不是mock来处理当前类,因为我们需要保留类的其他逻辑,只mock特定的getWebDriverFluentWait方法 - 分场景测试覆盖了方法里的分支逻辑,确保两种浏览器场景下的路径处理都正确
- 如果后续你补全了FluentWait的等待逻辑(比如判断文件是否存在、是否下载完成),可以在测试里进一步验证
mockFluentWait.until()的调用参数,确保等待逻辑符合预期
内容的提问来源于stack exchange,提问作者Paresh
相关产品推荐
相关产品推荐

