【问题标题】:How to unit test a simple repository that contains a dagger injection?如何对包含匕首注入的简单存储库进行单元测试?
【发布时间】:2018-04-18 16:33:35
【问题描述】:

我正在尝试对一个简单的存储库进行单元测试,但它给了我一个NullPointerException。存储库包含一种依赖于 webService 的方法。 webService 工作正常(我已成功测试)。我正在使用 Retrofit 进行 webService 和 Dagger 进行依赖注入。以下是我的代码:

网络服务

public interface UserWebService {
    @GET(USER_ENDPOINT)
    Call<UserResponse> getUser();
}

存储库

public class UserRepository {
    @Inject
    UserWebService mUserWebService;

    public void getUserEmail() throws IOException {       
      mUserWebService.getUser().execute().body().getUser().getEmail();
    }
}

单元测试

public class UserRepositoryTest {
    @Mock
    private UserWebService mUserWebService;

    @Test
    public void getUserEmail() throws IOException {
        when(mUserWebService.getUser().execute().body().getUser().getEmail())
                .thenReturn("some@email.com");

    }
}

附: NullPointerException 被抛出是因为 mUserWebService,这是可以理解的,但是我该如何测试这个单元呢?

【问题讨论】:

    标签: java android unit-testing mocking dagger-2


    【解决方案1】:

    单元测试通常意味着您测试单个组件,提供友好/模拟/存根来测试某些行为。在单元测试中不需要 Dagger,因此要回答您的问题,您只需将模拟传递给 UserRepository

    UserRepository repository = new UserRepository();
    repository.mUserWebService = mUserWebService;
    

    您可以/应该考虑切换到构造函数注入,因为不需要手动对存储库进行字段注入。这样你的测试也会变得更干净。

    public class UserRepository {
    
      UserWebService mUserWebService;
    
      @Inject
      public UserRepository(UserWebService userWebService) {
        mUserWebService = userWebService;
      }
    }
    
    // and then simply call the constructor...
    
    UserRepository repository = new UserRepository(mUserWebService);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      相关资源
      最近更新 更多