首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用mockito框架模拟/顽固性JCo库

使用mockito框架模拟/顽固性JCo库
EN

Stack Overflow用户
提问于 2018-02-18 13:57:59
回答 2查看 516关注 0票数 0

我正在编写一个基本的Java程序来连接到SAP服务器并检索一个BAPI函数。这个程序基本上展示了单元测试在开发中的重要性。但是,在编写单元测试时,我不希望真正连接到服务器并期望JCo返回类型。考虑到这一点,我继续使用Mockito框架来模拟/存根一些JCo库及其方法。我想提到的是,我对Java和Mockito都是新手,但是,我对C和C++有很好的经验。

主要代码:

代码语言:javascript
复制
package SAPConnection;

import java.util.Properties;

import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoDestinationManager;
import com.sap.conn.jco.JCoException;
import com.sap.conn.jco.JCoFunction;
import com.sap.conn.jco.ext.DestinationDataProvider;

public class sapConnection
{    
    public static JCoDestination getDestination() throws JCoException
    {
        JCoDestination destination = JCoDestinationManager.getDestination(DESTINATION_NAME1);
        return destination;
    }

    public static JCoFunction retrieveFunction(String funName, JCoDestination destination) throws JCoException
    {
        return(destination.getRepository().getFunction(funName)); 
    }

    public static void printMetaData(JCoFunction function)
    {
         System.out.println(function.getTableParameterList().getMetaData().toString());
         System.out.println("MetaData Printed Successfully\n\n");
    }    

    public static void main(String[] args) throws JCoException
    {
        JCoDestination Finaldestination = getDestination(); 
        JCoFunction function = 
        retrieveFunction("ZBAPI_GET_DOCUMENTS",Finaldestination);
        printMetaData(function);
    }
}

测试代码

代码语言:javascript
复制
package SAPConnection;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;

import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;

import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoDestinationManager;
import com.sap.conn.jco.JCoException;
import com.sap.conn.jco.JCoFunction;

public class testsapConnection {

public JCoDestinationManager destManager = Mockito.mock(JCoDestinationManager.class);
public JCoDestination destination=Mockito.mock(JCoDestination.class);
public JCoFunction function = Mockito.mock(JCoFunction.class);

@Test
public void testgetDestination() throws JCoException {
    when(destManager.getDestination("ABAP_AS_WITHOUT_POOL")).thenReturn(destination);
    assertEquals(destination,sapConnection.getDestination());
}
}

而不是一个简单的解决方案,请解释这些代码中的潜在错误和问题,以便我能够理解。

在做测试的时候说,

代码语言:javascript
复制
org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-18 14:22:49

JCoDestinationManager.getDestination是一个静态方法,您不能用'when‘来模拟它,因为它需要一个实例方法。您必须使用支持静态方法(如PowerMock )的模拟框架。

票数 0
EN

Stack Overflow用户

发布于 2022-03-24 20:05:37

使用最新的Mockito,您可以模拟静态方法。

代码语言:javascript
复制
try (MockedStatic<JCoDestinationManager> manager = mockStatic(JCoDestinationManager.class)) {
       manager.when(() ->
               JCoDestinationManager.getDestination("ABAP_AS_WITHOUT_POOL"))
              .thenReturn(destination);
       assertEquals(destination,sapConnection.getDestination());

    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48852467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档