使用 Mockito 模拟 Final 类
在 Java 测试领域,模拟非 Final 类是隔离依赖项和测试的常见做法在受控环境中编写代码。然而,最终类在模拟方面提出了独特的挑战。
例如,让我们考虑以下示例:
public final class RainOnTrees { public void startRain() {} } public class Seasons { RainOnTrees rain = new RainOnTrees(); public void findSeasonAndRain() {rain.startRain();} }
在这种情况下,我们有一个名为 RainOnTrees 的最终类,并且一类 Seasons 取决于它。为了有效地测试 Seasons,我们需要模拟 RainOnTrees。然而,Mockito 版本 1 本质上不可能模拟最终类。
Mockito Inline 来救援
为了克服这个限制,Mockito 版本 2 引入了mockito-inline允许模拟静态和最终类(包括构造函数)的包。要利用此功能,请将以下依赖项添加到您的 Gradle 文件中:
testImplementation 'org.mockito:mockito-inline:2.13.0'
使用 Mockito Inline 进行模拟
添加 mockito-inline 包后,将模拟 Final课程变得简单:
@ExtendWith(MockitoExtension.class) public class SeasonsTest { @Mock RainOnTrees rainMock; @BeforeEach public void setUp() { MockitoAnnotations.initMocks(this); } @Test public void testFindSeasonAndRain() { Seasons seasons = new Seasons(); // Inject the mock into the Seasons class ReflectionTestUtils.setField(seasons, "rain", rainMock); seasons.findSeasonAndRain(); // Verify that the mocked method was called Mockito.verify(rainMock).startRain(); } }
Final注意
需要注意的是,应谨慎使用模拟最终类,因为如果最终类的实现发生更改,它可能会导致脆弱的测试,这些测试可能会失败。如果可能,创建用于依赖注入的非最终类是测试的首选方法。
以上是如何使用 Mockito 模拟 Java 中的 Final 类?的详细内容。更多信息请关注PHP中文网其他相关文章!