在调用方法时,不明白模拟类的工作原理

时间:2013-08-01 18:53:05

标签: java unit-testing java-ee mocking mockito

我有一个有这样一个吸气剂的课:

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

    return animal;
}

我想为此创建一个简单的单元测试。我嘲笑crudRepository总是回归固定的动物。我还嘲笑了assetRepository并在我要测试的类上设置了模拟的存储库。但是,我不明白它是如何工作的,为什么我在调用attachAssets方法时不会得到nullpointers和错误?它有返回类型void。我的意思是,在attachAssets方法中,我使用了我从未创建过的东西(会话等)。 Mockito是否会自动捕获异常或其他内容,对于void方法还是什么特别的东西?换句话说,我没有找到attachAssets的{​​{1}}方法,所以为什么它不会失败(或者它甚至会失败,我不知道)?

2 个答案:

答案 0 :(得分:1)

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

Mockito的默认行为如果你还没有告诉它什么,那就是什么都不做或者返回null / 0,取决于哪个。如果你告诉它通常只会抛出异常。如果你调用一些意想不到的方法,其他模拟框架可能会抱怨。

答案 1 :(得分:1)

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

以下是一些示例类:

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()。