簡體   English   中英

EasyMock和JNA - 模擬通用返回類型

[英]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模擬返回泛型返回類型?

謝謝Damien

問題來自您輸入Capture<Class<?>> 這個通配符意味着你想捕獲something 讓我們稱之為capture#1 因此loadLibrary在參數中獲取一類capture#1並返回capture#1實例。 所以andReturn期望在參數中capture#1

但是你傳遞的是一個不是(顯然) capture#1ConvInterface

解決方案很簡單。 只需執行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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM