我正在尝试对一个简单的存储库进行单元测试,但它给了我一个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);