当前位置: 首页 > 知识库问答 >
问题:

为什么我从这个Spock测试中得到的调用太少了?

赖浩荡
2023-03-14

我是Spock测试框架的新手,我试图为我正在工作的一个android项目做一些测试。我目前测试的这些对象是PJO,所以可以用常规的Spock测试它们。出于某种原因,我一直在我的一个对象上调用isAlive方法,但我知道它被调用了,感觉我已经在调试器中运行了它,它被调用了。所以我希望有人能引导我知道我做错了什么。

 public void start(int startIndex, boolean overrideDownloadOnCellNetwork){
        this.downloadIndex = startIndex;
        this.overrideDownloadOnCellNetwork = overrideDownloadOnCellNetwork;
        if(checkConnectionType(overrideDownloadOnCellNetwork)){
            this.startTrackDownload();
        }
    }

    // I should simplify this at some point.
    private boolean checkConnectionType(boolean overrideDownloadOnCellNetwork) {
        ConnectivityManager connManager = (ConnectivityManager) masterService.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo connection = connManager.getActiveNetworkInfo();
        if(connection == null){
           broadcaster.broadcastError(DownloadEvent.DownloadEventType.ERROR_NO_NETWORK, downloadIndex);
            this.masterService.stop();
            return false;
        } else if(connection.getType() == ConnectivityManager.TYPE_MOBILE && (userModel.isCellDownloadsAllowed() || overrideDownloadOnCellNetwork)){
            return true;
        } else if (connection.getType() == ConnectivityManager.TYPE_WIFI){
            return true;
        } else {
            broadcaster.broadcastError(DownloadEvent.DownloadEventType.ERROR_NO_WIFI_CELL_DOWNLOAD_NOT_ALLOWED, downloadIndex);
            this.masterService.stop();
            return false;
        }
    }


    private void startTrackDownload(){
        if(trackList.size() > 0) {
            if (!downloadThread.isAlive()) {
                downloadThread.start();
            }
            downloadThread.downloadTrack(downloadIndex, trackList.size(), bookModel.getBookID(), userModel.getSessionID());
        }
    }

下面是我的测试代码:

DownloaderImp downloader // this is a POJO

MasterService masterService
ActiveBookFactory activeBook
TrackListSubscriber trackListSubscriber
UserModel userModel
TrackSaver trackSaver
Notification notification
BookSaver bookSaver
BookModel bookModel

DownloadEventBroadcaster eventBroadcaster
DownloadThread downloadThread

Context context;


def "setup"(){

    masterService = Mock(MasterService)
    trackListSubscriber = Mock(TrackListSubscriber)
    userModel = Mock(UserModel )
    trackSaver = Mock(TrackSaver )
    notification = Mock(Notification )
    bookSaver = Mock(BookSaver)
    bookModel = Mock(BookModel)
    activeBook = Mock(ActiveBookFactory )
    downloadThread = Mock(DownloadThread)
    eventBroadcaster = Mock(DownloadEventBroadcaster)

    bookModel.getTrackModels() >> [new TrackModel(1), new TrackModel(2)]
    activeBook.get("downloading") >> bookModel
    bookModel.getId() >> 1

    downloader = new DownloaderImp(activeBook,
            trackListSubscriber,
            userModel,
            trackSaver,
            bookSaver,
            downloadThread,
            eventBroadcaster)

    context = Mock(Context)
    masterService.getContext() >> context
    downloader.setService(masterService)

}

def "should check if download thread is alive"(){
    given:
    def mockConnectionManager = Mock(ConnectivityManager)
    def mockNetworkInfo = Mock(NetworkInfo)
    masterService.getContext().getSystemService(Context.CONNECTIVITY_SERVICE) >> mockConnectionManager
    mockConnectionManager.getActiveNetworkInfo() >> mockNetworkInfo
    mockNetworkInfo.getType() >> ConnectivityManager.TYPE_MOBILE

    when:
    downloader.start(0, true)

    then:
    1 * downloadThread.isAlive()
}

任何帮助都将不胜感激。我已经在我能想到的每种配置中尝试过了...它总是有同样的问题。

共有1个答案

蒋典
2023-03-14

这个问题贴出来已经有一段时间了,但无论如何我都会试着回答它。

对Thread对象进行单元测试是有问题的,因为isalive()方法是final boolean(您将无法模拟它)。在代码中,应避免在内部逻辑中使用此方法。在这种情况下使用包装器(比如接口)也许是个好主意,但最重要的是在测试线程时要计算start()interrupt()方法的调用。

 类似资料:
  • 下面是源代码和测试代码,有人能让我知道我做错了什么吗?似乎根本没有调用dao mock并返回“USA”。我在网上做了一些研究,找不到我做错了什么。 下面是我的Spock测试代码:

  • 编辑: 链接到repo示例:https://gitlab.com/bartekwichowski/spock-too-many

  • 我正在使用Javascript创建一个csv文件供下载,除了IE(我已经测试了8和10),它在所有方面都工作得非常好。 在IE8中,当我单击按钮创建并下载文件时,会出现一个错误,并显示“传递给系统调用的数据区域太小”。在IE10中,当我单击按钮时,它只会打开一个新选项卡,其中包含我在地址栏中创建的URL,但不会下载任何内容。 你知道这个错误是什么意思吗? 我在按钮中有此代码: 这与这个问题有关,但

  • 测试代码为: 测试代码为: 你知道怎么了吗?

  • 我遇到JSON解析错误。我的代码如下: 我从我的检查中得到以下错误: 由于:com,无法分析JSON。谷歌。格森。JsonSyntaxException:java。lang.IllegalStateException:应为BEGIN\u对象,但在第1行第2列为BEGIN\u数组 对于我试图读取的JSON,如果成功,我的应该返回5。 我做错了什么?