单元测试中的依赖服务空引用异常
Posted
技术标签:
【中文标题】单元测试中的依赖服务空引用异常【英文标题】:Dependency service Null Reference exception in unit testing 【发布时间】:2016-10-12 12:27:44 【问题描述】:我正在尝试将单元测试包含到我的 Xamarin PCL 项目中。
这就是我基本上在做的事情:
登录页面类:
public bool isUserRemembered()
return DependencyService.Get<IUserDefaults>().getUserRemembered();
public void setRememberUser(bool check)
DependencyService.Get<IUserDefaults>().setUserRemembered(check);
UnitTest 类(ios):
[Test]
public void RememberKeyTrueTest()
LoginPage page = new LoginPage();
bool isRemember = true;
page.setRememberUser(isRemember);
bool value = page.isUserRemembered();
if (value)
Pass();
else
Fail();
我在这一行得到空引用异常:DependencyService.Get<IUserDefaults>().setUserRemembered(check)
。
依赖服务是否可以与单元测试一起使用?或者有什么解决办法吗?
【问题讨论】:
您需要配置服务吗?在任何情况下,在逻辑代码中进行依赖解析都不是一个好主意,你应该在构造过程中注入依赖,这在测试中也变得更易于管理。不再需要在所有测试中“记住”维护的隐藏依赖项。 Unit testing with Xamarin.Forms' DependencyService 是just a Google each away 【参考方案1】:当我在我的代码中使用依赖注入时,我使用 IoC(控制反转)来处理在我的生产代码中创建依赖项,并在我的单元测试中手动创建我的依赖项。
我这样做的主要原因是它是明确的。通常我会使用 Mocking 框架来创建假实例,所以我不想要额外的复杂性。
关于您的待测代码的建议,您已将类的依赖项交换为对 DependencyService 的依赖项。我并不是说不要使用 DependencyService,但您可以将依赖项传递给类的构造函数。然后您的测试可以传入一个假实例,而生产代码将使用 DependencyService 为您获取 IUserDefaults 并将其传入。这将使您的类更易于测试。
【讨论】:
以上是关于单元测试中的依赖服务空引用异常的主要内容,如果未能解决你的问题,请参考以下文章
称为验证的 Mockito Kotlin 单元测试方法抛出空指针异常
Springboot单元测试调用Service或Dao方法出现空指针异常