Java 基于MVVM模式的android单元测试响应
我试图在android中使用MVVM模式时为存储库编写单元测试 我拥有的是一个存储库,它使用改造从网络中获取数据Java 基于MVVM模式的android单元测试响应,java,android,unit-testing,android-mvvm,Java,Android,Unit Testing,Android Mvvm,我试图在android中使用MVVM模式时为存储库编写单元测试 我拥有的是一个存储库,它使用改造从网络中获取数据 public class ValidateCbuRepository { private static ValidateCbuRepository single_instance = null; private MutableLiveData<CBUValidationImageResponse> data = new MutableLiveDa
public class ValidateCbuRepository {
private static ValidateCbuRepository single_instance = null;
private MutableLiveData<CBUValidationImageResponse> data = new MutableLiveData<>();
public static ValidateCbuRepository getInstance() {
if (single_instance == null)
single_instance = new ValidateCbuRepository();
return single_instance;
}
public MutableLiveData<CBUValidationImageResponse> processImage(String encodedString) {
JsonObject postParam = new JsonObject();
postParam.addProperty("image", encodedString);
Api service = RetrofitClientInstance.getRetrofitInstance().create(Api.class);
data.setValue(null);
HttpUrl httpUrl = HttpUrl.parse("some url");
Call<CBUValidationImageResponse> responseCall = service.getProcessedImage_cbu_validation(httpUrl.toString(),postParam);
responseCall.enqueue(new Callback<CBUValidationImageResponse>() {
@Override
public void onResponse(Call<CBUValidationImageResponse> call, Response<CBUValidationImageResponse> response) {
if(response.isSuccessful()) {
CBUValidationImageResponse res = response.body();
CBUValidationImageResponse cbuValidationImageResponse = res;
Log.i("CBU response ",""+cbuValidationImageResponse.toString());
cbuValidationImageResponse.setSuccess(true);
cbuValidationImageResponse.setShowProgres(false);
cbuValidationImageResponse.setError(false);
data.setValue(cbuValidationImageResponse);
}
}
@Override
public void onFailure(Call<CBUValidationImageResponse> call, Throwable t) {
CBUValidationImageResponse cbuValidationImageResponse = new CBUValidationImageResponse();
cbuValidationImageResponse.setError(true);
cbuValidationImageResponse.setShowProgres(false);
data.setValue(cbuValidationImageResponse);
t.printStackTrace();
}
});
return data;
}
}
public类validatecbreapository{
私有静态ValidateCBreapository单_实例=null;
私有MutableLiveData=new MutableLiveData();
公共静态ValidateCBreapository getInstance(){
if(单实例==null)
single_instance=new validatecbreapository();
返回单_实例;
}
公共可变LiveData processImage(字符串编码字符串){
JsonObject postParam=新的JsonObject();
postParam.addProperty(“图像”,编码字符串);
Api服务=RefughtClientInstance.GetRefughtInstance().create(Api.class);
data.setValue(空);
HttpUrl HttpUrl=HttpUrl.parse(“某个url”);
Call responseCall=service.getProcesseImage\u cbu\u验证(httpUrl.toString(),postParam);
responseCall.enqueue(新的回调(){
@凌驾
公共void onResponse(调用、响应){
if(response.issusccessful()){
CBUValidationImageResponse res=response.body();
CBUValidationImageResponse CBUValidationImageResponse=res;
Log.i(“CBU响应”,“”+cbuValidationImageResponse.toString());
cbuValidationImageResponse.setSuccess(true);
cbuValidationImageResponse.setShowProgres(假);
cbuValidationImageResponse.setError(false);
数据设置值(cbuValidationImageResponse);
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
CBUValidationImageResponse CBUValidationImageResponse=新的CBUValidationImageResponse();
cbuValidationImageResponse.setError(true);
cbuValidationImageResponse.setShowProgres(假);
数据设置值(cbuValidationImageResponse);
t、 printStackTrace();
}
});
返回数据;
}
}
单元测试部分
@Mock
private Observer<CBUValidationImageResponse> observer;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testApiResponse_success() {
Api mockedApiInterface = Mockito.mock(Api.class);
Call<CBUValidationImageResponse> mockedCall = Mockito.mock(Call.class);
Mockito.when(mockedApiInterface.getProcessedImage_cbu_validation(any(),any())).thenReturn(mockedCall);
try {
Mockito.doAnswer(new Answer() {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
Callback<CBUValidationImageResponse> callback = invocation.getArgument(0);
CBUValidationImageResponse cbuValidationImageResponse = new CBUValidationImageResponse();
cbuValidationImageResponse.setCBU_code("some code");
cbuValidationImageResponse.setHeight(7);
cbuValidationImageResponse.setBreadth(7);
cbuValidationImageResponse.setLength(7);
callback.onResponse(mockedCall, Response.success(cbuValidationImageResponse));
// or callback.onResponse(mockedCall, Response.error(404. ...);
// or callback.onFailure(mockedCall, new IOException());
return null;
}
}).when(mockedCall).enqueue(any(Callback.class));
ValidateCbuRepository validateCbuRepository = new ValidateCbuRepository();
String encodedString= "";
validateCbuRepository.processImage(encodedString).observeForever(observer);
@Mock
私人观察员;
@以前
公共作废设置(){
initMocks(this);
}
@试验
公共无效测试响应成功(){
Api mockedApiInterface=Mockito.mock(Api.class);
Call mockedCall=Mockito.mock(Call.class);
Mockito.when(mockedApiInterface.getProcessedImage\u cbu\u验证(any(),any())。然后返回(mockedCall);
试一试{
Mockito.doAnswer(新答案(){
@凌驾
公共Void应答(invocationmock调用)抛出可丢弃的{
Callback Callback=invocation.getArgument(0);
CBUValidationImageResponse CBUValidationImageResponse=新的CBUValidationImageResponse();
cbuValidationImageResponse.setCBU_代码(“某些代码”);
cbuValidationImageResponse.设定高度(7);
cbuValidationImageResponse.setbreath(7);
cbuValidationImageResponse.setLength(7);
onResponse(mockedCall,Response.success(cbuValidationImageResponse));
//或callback.onResponse(mockedCall,Response.error)(404…);
//或callback.onFailure(mockedCall,newioexception());
返回null;
}
}).when(mockedCall).enqueue(any(Callback.class));
validatecbreapository validatecbreapository=新的validatecbreapository();
字符串encodedString=“”;
ValidateCBreapository.processImage(encodedString).ObserveForRever(observer);
在validatecbreapository.processImage(encodedString).observeforevir(observer)
处获取空指针异常。下一步是验证该观察者
我希望测试能通过。我做错了什么?我做了一些类似于foe视图模型的事情,测试以100%的代码覆盖率通过
改装调用是异步的。这就是它失败的原因吗
编辑:在测试导致NPE时,livedata似乎为null。在单元测试中,您似乎忽略了以下规则:@estn修复了NPE的问题。但在测试observer onChanged值为null时,让我们尝试另一件事-将该模拟观察者订阅移动到@Before