单元测试中的依赖服务空引用异常

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&lt;IUserDefaults&gt;().setUserRemembered(check)

依赖服务是否可以与单元测试一起使用?或者有什么解决办法吗?

【问题讨论】:

您需要配置服务吗?在任何情况下,在逻辑代码中进行依赖解析都不是一个好主意,你应该在构造过程中注入依赖,这在测试中也变得更易于管理。不再需要在所有测试中“记住”维护的隐藏依赖项。 Unit testing with Xamarin.Forms' DependencyService 是just a Google each away 【参考方案1】:

当我在我的代码中使用依赖注入时,我使用 IoC(控制反转)来处理在我的生产代码中创建依赖项,并在我的单元测试中手动创建我的依赖项。

我这样做的主要原因是它是明确的。通常我会使用 Mocking 框架来创建假实例,所以我不想要额外的复杂性。

关于您的待测代码的建议,您已将类的依赖项交换为对 DependencyService 的依赖项。我并不是说不要使用 DependencyService,但您可以将依赖项传递给类的构造函数。然后您的测试可以传入一个假实例,而生产代码将使用 DependencyService 为您获取 IUserDefaults 并将其传入。这将使您的类更易于测试。

【讨论】:

以上是关于单元测试中的依赖服务空引用异常的主要内容,如果未能解决你的问题,请参考以下文章

尝试通过测试单元引用数据库连接时出现 C#.net 异常

称为验证的 Mockito Kotlin 单元测试方法抛出空指针异常

Springboot单元测试调用Service或Dao方法出现空指针异常

Springboot单元测试调用Service或Dao方法出现空指针异常

Angular中的单元测试

springBoot---单元测试,全局异常