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

通用的底部

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

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