如何对包含匕首注入的简单存储库进行单元测试?

时间:2018-04-18 16:33:36

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

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

web服务

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");

    }
}

P.S。由于NullPointerException引发了mUserWebService这是可以理解的,但我怎么能测试这个单位呢?

1 个答案:

答案 0 :(得分:2)

单元测试通常意味着您测试单个组件,提供友谊/模拟/存根来测试某些行为。在单元测试中不需要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);