在Android应用程序中进行单元测试时,可能会遇到处理网络请求时出现HttpException的情况。下面是一种解决方法,其中包含了代码示例:
public class MyHttpClient {
private OkHttpClient client;
public MyHttpClient() {
client = new OkHttpClient();
}
public Response executeRequest(Request request) throws IOException {
return client.newCall(request).execute();
}
}
public class MyApiService {
private MyHttpClient client;
public MyApiService(MyHttpClient client) {
this.client = client;
}
public void fetchData(final Callback callback) {
Request request = new Request.Builder()
.url("https://example.com/api/data")
.build();
try {
Response response = client.executeRequest(request);
if (response.isSuccessful()) {
// 处理成功响应
String responseData = response.body().string();
callback.onSuccess(responseData);
} else {
// 处理异常响应
throw new HttpException(response.code());
}
} catch (IOException e) {
// 处理网络请求异常
e.printStackTrace();
callback.onError(e.getMessage());
}
}
}
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.io.IOException;
import static org.mockito.Mockito.*;
public class MyApiServiceTest {
@Mock
private MyHttpClient mockHttpClient;
private MyApiService apiService;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
apiService = new MyApiService(mockHttpClient);
}
@Test
public void testFetchData_SuccessfulResponse() throws IOException {
Response successfulResponse = new Response.Builder()
.code(200)
.body(ResponseBody.create(MediaType.get("application/json"), "mock response"))
.build();
when(mockHttpClient.executeRequest(any(Request.class))).thenReturn(successfulResponse);
Callback mockCallback = mock(Callback.class);
apiService.fetchData(mockCallback);
verify(mockCallback).onSuccess("mock response");
verify(mockCallback, never()).onError(anyString());
}
@Test
public void testFetchData_ErrorResponse() throws IOException {
Response errorResponse = new Response.Builder()
.code(404)
.build();
when(mockHttpClient.executeRequest(any(Request.class))).thenReturn(errorResponse);
Callback mockCallback = mock(Callback.class);
apiService.fetchData(mockCallback);
verify(mockCallback, never()).onSuccess(anyString());
verify(mockCallback).onError("HTTP 404 Not Found");
}
}
上述示例代码展示了如何使用Mockito框架来模拟MyHttpClient类的行为,并测试MyApiService类的fetchData方法在不同响应情况下的行为。您可以根据自己的需求和具体的网络请求库来进行适当的修改和调整。