我有一个有这样一个吸气剂的课:
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}}方法,所以为什么它不会失败(或者它甚至会失败,我不知道)?
答案 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()。