当我为MyClass创建一个单元测试,并想在其中模拟SomeOtherClass时,我通常将其注入仅应用于单元测试的构造函数中。该构造函数可以是protected
或package-private
(与默认public
相对),因此我们已经确定在项目的其他大多数地方它是不可调用的。
但是,Android注释@RestrictTo
可以进一步改善这一点!它可以限制的范围之一是RestrictTo.Scope.TESTS
,这就是我想要的!或者至少我是这样认为的。
我还在MyClass本身的默认构造函数中调用此构造函数(以防止两个构造函数重复)。这会在this
上发出警告,因为-当然-在单元测试中不会被调用:
public MyClass()
{
this(new SomeOtherClass()); // <<< Warning here
}
@RestrictTo(RestrictTo.Scope.TESTS)
MyClass(SomeOtherClass someOtherClass)
{
this.someOtherClass = someOtherClass;
}
在我看来,如果类本身不能调用它自己的方法/构造函数,那将很奇怪。我使用正确吗?有什么办法可以避免这种警告而不复制构造函数的内容?还是有其他方法来限制程序包私有的构造函数不被外部单元测试调用(类本身是唯一的例外)?
ps。我也尝试过定义如下所示的几个范围,但它的行为似乎像&&
而不是||
@RestrictTo({RestrictTo.Scope.TESTS, RestrictTo.Scope.SUBCLASSES})