我有一个类有一个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方法来说是特别的吗?换句话说,我还没有存根assetRepository
的attachAssets
方法,所以为什么它不失败(或者它应该失败吗,我不知道)?
下面是一些示例类:
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,以合适的为准。如果你告诉它,它通常只会抛出一个异常。如果你调用了一些意想不到的方法,其他嘲讽框架可能会抱怨。