Android: 如何在 Robolectric 中测试 PDFView?

Android: how test PDFView in Roboelectric?

我用PDFView显示PDF文件,很成功。但是我不知道如何在单元测试中测试这个方法。

com.github.barteksc.pdfviewer.PDFView pdfview = mainView.findViewById(R.id.pdfview);

public void showDocument(final InputStream inputStream){

    pdfview.fromStream(inputStream)
            .enableSwipe(true)
            .swipeHorizontal(false)
            .enableDoubletap(true)
            .onPageChange(new OnPageChangeListener() {
                @Override
                public void onPageChanged(int page, int pageCount) {
                }
            })
            .onLoad(new OnLoadCompleteListener() {
                @Override
                public void loadComplete(int nbPages) {
                    closeProgress();
                    totalPages = nbPages;
                    System.out.println("nbPages"+nbPages);
                }
            })
            .onError(new OnErrorListener() {
                @Override
                public void onError(Throwable t) {                                           
                    System.out.println("onError"+t.getMessage());
                }
            })
            .load();
}

我的测试方法:

@Test
public void testFetchDataFromNet() {

    DocumentActivity activity = Robolectric.setupActivity(DocumentActivity.class);
    activity.showDocument(PDFData.iputStreamPDF);
    ShadowLooper.runUiThreadTasksIncludingDelayedTasks();

}

但是onLoad() 和onError() 都没有在控制台打印任何数据。 我试了自定义阴影:

@Implements(PDFView.class)
public class ShadowPDFView extends ShadowRelativeLayout {

Context context;
AttributeSet attrs;

@Implementation
public void __constructor__(Context context)
{
}

@Implementation
public void __constructor__(Context context, AttributeSet attrs)
{
    this.context = context;
    this.attrs = attrs;
}

@Implementation
public void __constructor__(Context context, AttributeSet attrs, int defStyleAttr)
{
}

PDFView.Configurator configurator;

@Implementation
public PDFView.Configurator fromStream(InputStream stream) {
    DocumentSource documentSource = new InputStreamSource(stream);

    Class clazz = null;
    try {

        Class c2 = Class.forName("com.github.barteksc.pdfviewer.PDFView$Configurator");
        Constructor constructor = c2.getDeclaredConstructor(new Class[] {PDFView.class, DocumentSource.class });
        constructor.setAccessible(true);
        if (constructor != null) {
            configurator = (PDFView.Configurator) constructor.newInstance(new PDFView(context,attrs), documentSource);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    return configurator;
}

}

但没有任何改变。

请帮助或尝试提供一些实现方法。

我将不胜感激!

需要 ShadowPDFView 而不是 ShadowPDFConfigurator,像这样:

@SuppressWarnings({"unused", "EmptyMethod"})
@Implements(PDFView.Configurator.class)
public class ShadowPDFConfigurator{

OnLoadCompleteListener onLoadCompleteListener;

@Implementation
public void __constructor__(DocumentSource documentSource)
{
}

@RealObject
PDFView.Configurator configurator;
@Implementation
public Object enableSwipe(boolean enableSwipe) {
    DebugUtils.getInstance().system("enableSwipe","");
    return configurator;
}

@Implementation
public Object swipeHorizontal(boolean swipeHorizontal) {
    DebugUtils.getInstance().system("swipeHorizontal","");
    return configurator;
}

@Implementation
public Object enableDoubletap(boolean enableDoubletap) {
    DebugUtils.getInstance().system("enableDoubletap","");
    return configurator;
}

@Implementation
public Object onPageChange(OnPageChangeListener onPageChangeListener) {
    DebugUtils.getInstance().system("onPageChangeListener","");
    return configurator;
}

@Implementation
public Object onLoad(OnLoadCompleteListener onLoadCompleteListener) {
    DebugUtils.getInstance().system("onLoadCompleteListener","");
    this.onLoadCompleteListener = onLoadCompleteListener;
    return configurator;
}

@Implementation
public Object onError(OnErrorListener onErrorListener) {
    DebugUtils.getInstance().system("onErrorListener","");
    return configurator;
}

@Implementation
public void load() {
    DebugUtils.getInstance().system("load","");
    this.onLoadCompleteListener.loadComplete(1);
}

}