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



我正在尝试对一个简单的存储库进行单元测试,但它给了我一个NullPointerException.存储库包含一个依赖于 Web 服务的方法。网络服务工作正常(我成功测试(。我正在使用 Retrofit for 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而抛出,这是可以理解的,但我如何测试这个单元呢?

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

最新更新