1.概述

单元测试的挑战之一是模拟私有方法。

在本教程中,我们将了解如何通过使用金宝搏官网188bePowerMocklibrary -由JUnit和TestNG支持。

PowerMock与EasyMock和Mockito等模拟框架集成,旨在向这些框架添加额外的功能——例如模拟私有方法、final类和final方法,等。

它通过依赖字节码操作和一个完全独立的类加载器来实现这一点。

2.Maven的依赖关系

首先,让我们将使用PowerMock和Mockito和JUnit所需的依赖项添加到pom.xml

<依赖> < groupId > org。powermock   1.7.3 test   。powermock-api- mockit2  1.7.3 test 

可查看最新版本在这里在这里

3.例子

让我们从a的例子开始LuckyNumberGenerator。这个类有一个用于生成幸运数字的公共方法:

public int getLuckyNumber(String name) {saveIntoDatabase(name);if (name == null) {return getDefaultLuckyNumber();}返回getComputedLuckyNumber (name.length ());}

4.私有方法模仿的变体

为了对该方法进行详尽的单元测试,我们需要模拟私有方法。

4.1。没有参数但具有返回值的方法

作为一个简单的例子,让我们模拟一个不带参数的私有方法的行为,并强制它返回所需的值:

LuckyNumberGenerator mock = spy(new LuckyNumberGenerator());模拟时,“getDefaultLuckyNumber”).thenReturn (300);

在本例中,我们模拟私有方法getDefaultLuckyNumber并让它返回一个值300。

4.2.带有参数和返回值的方法

接下来,让我们用一个参数来模拟私有方法的行为,并强制它返回想要的值:

LuckyNumberGenerator mock = spy(new LuckyNumberGenerator());doReturn(1)。模拟时,“getComputedLuckyNumber”,ArgumentMatchers.anyInt ());

在本例中,我们模拟私有方法并使其返回1。

注意,我们并不关心输入参数和使用金宝搏官网188beArgumentMatchers.anyInt ()作为一个通配符。

4.3。方法调用的验证

我们的最后一个策略是使用PowerMock来验证私有方法的调用:

LuckyNumberGenerator mock = spy(new LuckyNumberGenerator());int result = mock.getLuckyNumber(“Tyranosorous”);verifyPrivate(模拟)。调用(“saveIntoDatabase ArgumentMatchers.anyString ());

5.注意事项

最后,尽管可以使用PowerMock测试私有方法,我们在使用这项技术时必须格外小心。

既然我们测试的目的是验证类的行为,那么我们应该避免在单元测试期间更改类的内部行为。

mock技术应该应用于类的外部依赖项,而不是类本身。

如果私有方法的mock对于测试我们的类是必要的,那么它通常意味着一个糟糕的设计。

6.结论

在这篇快速文章中,我们展示了如何使用PowerMock扩展mockto的功能,以模拟和验证被测类中的私有方法。

可以找到本教程的源代码在GitHub

通用的底部

开始使用Spring 5和Spring Boot 2,通过学习的春天课程:

>>看看这个课程
对这篇文章的评论关闭!