EasyMock和JNA - 模拟通用返回类型

时间:2017-08-06 11:50:51

标签: java unit-testing mocking powermock easymock

我正在尝试使用EasyMock模拟以下JNA调用

convInterface = (ConvInterface)  Native.loadLibrary(libraryLocation,ConvInterface.class);

使用此测试方法

@Test
public void testLib() {
    Capture<Class<?>> myClassCapture  = EasyMock.newCapture();
    PowerMock.mockStatic(Native.class);

    EasyMock.expect(Native.loadLibrary(EasyMock.isA(String.class), EasyMock.capture(myClassCapture))).andReturn(mockConvInterface);
    PowerMock.replay(Native.class);

    ConvServiceImpl myLib = new ConvServiceImpl();
    myLib.instantiateConvLibrary();

    PowerMock.verify(Native.class);
}

我使用JNA库的4.3.0版获得以下错误

The method andReturn(capture#1-of ?) in the type IExpectationSetters<capture#1-of ?> is not applicable for the arguments (ConvInterface)

相同的代码适用于JNA库的4.2.0版

以下是我试图模拟的方法的方法签名

版本4.2.0

public static Object loadLibrary(String name, Class interfaceClass) {

版本4.3

public static <T> T loadLibrary(String name, Class<T> interfaceClass) {

如何使用EasyMock模拟返回泛型返回类型?

由于 达明

1 个答案:

答案 0 :(得分:3)

问题来自您输入something。此通配符表示您要捕获capture#1。我们称之为loadLibrary。因此capture#1在参数中获取capture#1类并返回andReturn实例。因此capture#1要求ConvInterface参数。

但是你传递的capture#1不是(显然)Capture<Class<ConvInterface>> myClassCapture = EasyMock.newCapture();

解决方案很简单。只需loadLibrary,因为这是您期望 private Vector3 _position; private void DeterminePosition(float offset) { // In actual code, the _position is initialized under Start() method // But for this simplification sake, I'll just put it here _position = _position == null ? new Vector3(0, 0, 1f) : _position; if (Direction == Direction.Up || Direction == Direction.RightUp || Direction == Direction.LeftUp) { _position.y = offset; } if (Direction == Direction.Down || Direction == Direction.RightDown || Direction == Direction.LeftDown) { _position.y = -offset; } if (Direction == Direction.Left || Direction == Direction.LeftDown || Direction == Direction.LeftUp) { _position.x = -offset; } if (Direction == Direction.Right || Direction == Direction.RightDown || Direction == Direction.RightUp) { _position.x = offset; } transform.position = _position; } 获得的。