我们应该在构造函数中放置多少初始化代码?问题在于,放入大量代码会导致测试期间出现问题,因为某些字段可能取决于特定于平台的事物,例如 BLE 或 NFC。例如:
class MyClass{
late Hardware hardware;
MyClass()
{
hardware = Hardware(); //platform dependent object
hardware.onEvent.listen(..); //subscribe to hardware events
...
}
}
然后我想测试 MyClass,但遇到问题,因为硬件在测试期间无效。
test('test something', () {
var myClass = MyClass();//errors or bad behaviour here
...
});
});
也许让构造函数尽可能简单然后使用“init”函数是有意义的?
这个特定问题的解决方案是让类通过定义其行为但不定义其实现的接口来引用“硬件”。
如果硬件类没有接口(或者它对您来说太具体),您可以创建自己的接口,并围绕实现该接口的硬件创建一个适配器类。
实际的硬件对象(可能包装在适配器中)应该在构造函数中或使用 setter 传递给类(而不是使用
new
来创建实现)。这样,该类就不知道它正在处理的硬件的细节。
在测试中,您可以创建模拟硬件类来模拟真实的硬件类。
实际的硬件实现对象将在此类的外部通过一段代码创建,其工作是了解细节。您甚至可以动态构造硬件对象。
您可能会发现查找“依赖注入”和 Spring 等框架很有用。
解决“测试对象”问题的另一种方法是使用 Mockito 等创建模拟对象的库。