首页 >Java >java教程 >如何使用 Mockito 模拟 Java 中的 Final 类?

如何使用 Mockito 模拟 Java 中的 Final 类?

Susan Sarandon
Susan Sarandon原创
2024-12-09 21:38:11937浏览

How Can I Mock Final Classes in Java Using Mockito?

使用 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn