我正在编写一个基本的Java程序来连接到SAP服务器并检索一个BAPI函数。这个程序基本上展示了单元测试在开发中的重要性。但是,在编写单元测试时,我不希望真正连接到服务器并期望JCo返回类型。考虑到这一点,我继续使用Mockito框架来模拟/存根一些JCo库及其方法。我想提到的是,我对Java和Mockito都是新手,但是,我对C和C++有很好的经验。
主要代码:
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);
}
}测试代码
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());
}
}而不是一个简单的解决方案,请解释这些代码中的潜在错误和问题,以便我能够理解。
在做测试的时候说,
org.mockito.exceptions.misusing.MissingMethodInvocationException:
when() requires an argument which has to be 'a method call on a mock'.发布于 2018-02-18 14:22:49
JCoDestinationManager.getDestination是一个静态方法,您不能用'when‘来模拟它,因为它需要一个实例方法。您必须使用支持静态方法(如PowerMock )的模拟框架。
发布于 2022-03-24 20:05:37
使用最新的Mockito,您可以模拟静态方法。
try (MockedStatic<JCoDestinationManager> manager = mockStatic(JCoDestinationManager.class)) {
manager.when(() ->
JCoDestinationManager.getDestination("ABAP_AS_WITHOUT_POOL"))
.thenReturn(destination);
assertEquals(destination,sapConnection.getDestination());
}https://stackoverflow.com/questions/48852467
复制相似问题