1.概述
一些流行的mocking库,如5和Easymock通过利用Java的基于继承的类模型来生成模型。EasyMock在运行时实现接口,然而5从目标类继承来创建一个mock存根。
这两种方法都不能很好地用于静态方法,因为静态方法与类关联,不能被重写。然而,JMockit确实提供了静态方法模拟特性。
在本教程中,我们将探索其中一些特性。
有关JMockit的介绍,请参阅我们的前一篇文章。
2.Maven的依赖关系
让我们从Maven依赖开始:
<依赖> < groupId > org。jmockit jmockit 1.24 test
您可以在上找到这些库的最新版本Maven中央。
3.静态方法从非静态方法调用
首先,让我们考虑一个案例具有内部依赖于静态方法的非静态方法的类:
public class AppManager {public boolean managerResponse(String question) {return AppManager. isresponsepositive (question);} public static boolean isResponsePositive(String value) {if (value == null){返回false;} int length = value.length();int randomNumber = randomNumber();return length == randomNumber ?真:假;} private static int randomNumber() {return new Random().nextInt(7);}}
现在,我们想测试这个方法managerResponse()。由于它的返回值依赖于另一个方法,我们需要模拟isResponsePositive ()方法。
我们可以使用JMockit的匿名类mockit.MockUp.MockUp < T >(T是类名),@Mock注释:
@Test public void givenAppManager_whenStaticMethodCalled_thenValidateExpectedResponse() {new MockUp() {@Mock public boolean isResponsePositive(String value){返回false;}};assertFalse (appManager。managerResponse(“一些字符串…”));}
这里,我们在模仿isResponsePositive ()使用我们希望用于测试的返回值。因此,验证预期的结果使用断言在Junit-5中可用的实用程序。
4.测试私有静态方法
在少数情况下,其他方法使用类的私有静态方法:
private static Integer stringToInteger(String num) {return Integer. parseint (num);}
为了测试这种方法,我们需要模拟私有静态方法。我们可以使用Deencapsulation.invoke ()提供的实用方法JMockit:
@Test public void givenAppManager_whenPrivateStaticMethod_thenValidateExpectedResponse() {int response = de封装。invoke(AppManager.class, "stringToInteger", "110");assertequal(110年,响应);}
顾名思义,它的目的是de-encapsulate对象的状态。通过这种方式,JMockit简化了其他方式无法测试的测试方法。
5.结论
在本文中,我们看到了静态方法是如何被嘲弄的JMockit。要更深入地了解JMockit的一些高级特性,请查看我们的JMockit高级用法文章。
和往常一样,本教程的完整源代码是可用的在GitHub。