不明白调用方法时模拟类是如何工作的



我有一个类有一个getter,如下所示:

public Animal get(int id) {
    final Animal animal = crudRepository.get(id);
    assetRepository.attachAssets(animal);
    return animal;
}

我想为此创建一个简单的单元测试。我嘲笑crudRepository总是返回一个固定的动物。我还模拟了assetRepository,并在要测试的类上设置了模拟的存储库。然而,我不明白它是如何工作的,为什么我在调用attachAssets方法时不得到null指针和错误?它具有返回类型void。我的意思是,在attachAssets方法中,我使用了从未创建过的东西(会话等)。Mockito会自动捕获异常吗?它对void方法来说是特别的吗?换句话说,我还没有存根assetRepositoryattachAssets方法,所以为什么它不失败(或者它应该失败吗,我不知道)?

mock是一个伪实现。它是mocked类的一个子类,它覆盖了它的所有方法,并用alomst-nothing替换它们的实现(即,它返回你告诉它返回的内容,抛出你告诉它抛出的内容,并记录调用,以便在调用之后能够验证它们)。

下面是一些示例类:

public class AssetRepository {
    public void attachAssets(Animal a) {
        // some real implementation
    }
}

下面是Mockito创建的模拟实现的简化示例:

public class MockAssetRepository extends AssetRepository {
    private List<Invocation> invocations = new ArrayList<>();
    @Override
    public void attachAssets(Animal a) {
        // store the invocation to be able to chack if it has been called, 
        // how many times, etc.
        invocations.add(new Invocation("attachAssets", a);
    }
}

您可以看到,无论您的实现是什么,它都不会被调用,因为attachAssets()在mock中被重写。

如果模拟AssetPositional,则在mock上调用方法,并且实际实现不再重要。相反,Mockito使用了该方法的伪版本(它什么都不做)。

如果你没有告诉Mockito任何其他事情,它的默认行为是什么都不做或返回null/0,以合适的为准。如果你告诉它,它通常只会抛出一个异常。如果你调用了一些意想不到的方法,其他嘲讽框架可能会抱怨。

相关内容

  • 没有找到相关文章

最新更新