首页 > 解决方案 > 从 Junit 和 Mockito 中的另一个公共类中为最终类方法存根

问题描述

我需要在其他公共类方法中存根Final Class 方法。我的场景,我有一个类名ElasticIntegration,它是公共类。有一个方法叫licenseCheckOut

public Response licenseCheckOut(String jsonObj) {
    LogResource logData = new LogResource();
    try {
        LicenseServiceImpl licenseCheck = new LicenseServiceImpl();
        JSONObject queryObj = new JSONObject(jsonObj);
        int licenseId = -1;         
        Properties configProperties = Utilities.getConfigProperties();      
        Utilities.verifykeycloakToken(queryObj, configProperties);
        String userName = userAuth.getUserInfo(queryObj,configProperties);
        if(userName !=null){
            licenseId = licenseCheck.checkoutLicense(userName);
        }
        String result = "{\"licenseid\": "+ licenseId +"}";
        return Response.ok(result).build();
    } catch (Exception ex) {
        LogDetail details = Utilities.constructDetails("licenseCheckOut", ex);
        logData.writeLogMessage(null, details);
        return Response.serverError().entity(details).build();
    }
}

licenseCheckOut方法中有verifykeycloakToken是我们需要存根的方法。实用程序 最后一类。

**实用程序类中的verifykeycloakToken函数**

如果您检查上面的图像参考究竟是connection.connect()我们得到了错误。所以我用when( ).thenReturn( )存根类

    Utilities util = new Utilities();
    Utilities mock = mock(Utilities.class);
    JSONObject queryObj = new JSONObject(jsonObj);
    Properties mapProperties = null ;
    when(mock.verifykeycloakToken(queryObj, mapProperties)).thenReturn(true);

我到这里的错误是

org.mockito.exceptions.base.MockitoException:无法模拟/监视类 com.project.Utilities Mockito 无法模拟/监视,因为:- ElasticIntegrationTest.licenseCheckOut_verifykeycloakToken_ShouldReturnSuccessBuild 的最终类(ElasticIntegrationTest.java:51)

标签: javamockitojunit5

解决方案


verifykeycloakTokenUtilities课堂上的方法是一种static方法。

要模拟这一点,您可以探索以下选项:

  • 模拟verifykeycloakToken函数内部的所有内容。在您的情况下,这似乎很难做到,因为您正在其中创建无法处理的new URL() 对象。mockito
  • 使用powermockito因为 mocktio 单独无法处理模拟static

PS:使用powermock通常不受欢迎,特别是如果您遵循TDD但在处理遗留代码时,它确实会派上用场。


推荐阅读