EasyMock 和 JNA - 模拟通用 Return 类型
EasyMock and JNA - Mock Generic Return Type
我正在尝试使用 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 模拟通用 return 类型的 return?
谢谢
达米恩
问题出在您输入 Capture<Class<?>>
。此通配符表示您要捕获 something
。我们称它为 capture#1
。所以 loadLibrary
在参数中得到一个 class of capture#1
并且 return 得到一个 capture#1
实例。所以 andReturn
期望参数中有一个 capture#1
。
但是您传递的 ConvInterface
显然不是 capture#1
。
解决方法很简单。只需执行 Capture<Class<ConvInterface>> myClassCapture = EasyMock.newCapture();
,因为这是您期望 loadLibrary
得到的结果。
我认为最简单的答案是:不要使用Capture
进行此测试,没有必要。
问题使用 PowerMock + EasyMock,但由于我手头没有这些库,这里是使用 JMockit 的更短版本的测试(已验证有效):
import org.junit.*;
import static org.junit.Assert.*;
import mockit.*;
import com.sun.jna.*;
public final class JNATest {
public interface ConvInterface extends Library {}
public static class ConvServiceImpl {
final String libraryLocation = "whatever";
ConvInterface convInterface;
public void instantiateConvLibrary() {
convInterface = Native.loadLibrary(libraryLocation, ConvInterface.class);
}
}
@Test
public void testLib(
@Mocked Native mockNative, @Mocked ConvInterface mockConvInterface
) {
ConvServiceImpl myLib = new ConvServiceImpl();
myLib.instantiateConvLibrary();
assertSame(mockConvInterface, myLib.convInterface);
}
}
我正在尝试使用 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 模拟通用 return 类型的 return?
谢谢 达米恩
问题出在您输入 Capture<Class<?>>
。此通配符表示您要捕获 something
。我们称它为 capture#1
。所以 loadLibrary
在参数中得到一个 class of capture#1
并且 return 得到一个 capture#1
实例。所以 andReturn
期望参数中有一个 capture#1
。
但是您传递的 ConvInterface
显然不是 capture#1
。
解决方法很简单。只需执行 Capture<Class<ConvInterface>> myClassCapture = EasyMock.newCapture();
,因为这是您期望 loadLibrary
得到的结果。
我认为最简单的答案是:不要使用Capture
进行此测试,没有必要。
问题使用 PowerMock + EasyMock,但由于我手头没有这些库,这里是使用 JMockit 的更短版本的测试(已验证有效):
import org.junit.*;
import static org.junit.Assert.*;
import mockit.*;
import com.sun.jna.*;
public final class JNATest {
public interface ConvInterface extends Library {}
public static class ConvServiceImpl {
final String libraryLocation = "whatever";
ConvInterface convInterface;
public void instantiateConvLibrary() {
convInterface = Native.loadLibrary(libraryLocation, ConvInterface.class);
}
}
@Test
public void testLib(
@Mocked Native mockNative, @Mocked ConvInterface mockConvInterface
) {
ConvServiceImpl myLib = new ConvServiceImpl();
myLib.instantiateConvLibrary();
assertSame(mockConvInterface, myLib.convInterface);
}
}