1

我有一个类有一个像这样的吸气剂:

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

    return animal;
}

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

4

2 回答 2

1

模拟是一个虚拟实现。它是模拟类的一个子类,它覆盖了它的所有方法,并且几乎什么都没有替换它们的实现(即它返回你告诉它返回的东西,抛出你告诉它抛出的东西,并记录调用以便能够在之后验证它们)。

这是一些示例类:

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() 在模拟中被覆盖。

于 2013-08-01T19:00:50.843 回答
1

如果您模拟 AssetRepository,则在模拟上调用方法,实际实现不再重要。相反,Mockito 使用该方法的虚拟版本(什么都不做)。

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

于 2013-08-01T18:55:06.867 回答