tjh*_*s66 2 mockito java-8 spring-boot
我在 Spring Boot 2 应用程序中编写了代码,以使用 HTTPUrlConnection 进行第三方 API 调用。
public String loginApi(LoginDTO loginDto)
{
String responseData = null;
HttpURLConnection conn = null;
try {
link = authBaseUrl + loginUrl;
url = new URL(link);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty(CONTENT_TYPE, MEDIA_TYPE);
String body = getAuth0LoginDto(loginDto);
// =====================
// For POST only - START
conn.setDoOutput(true);
OutputStream os = conn.getOutputStream();
os.write(body.getBytes(StandardCharsets.UTF_8));
os.flush();
os.close();
// For POST only - END
// ====================
try (BufferedReader br = (conn.getResponseCode() >= 400
? new BufferedReader(new InputStreamReader(conn.getErrorStream()))
: new BufferedReader(new InputStreamReader(conn.getInputStream())))) {
StringBuilder everything = new StringBuilder();
String output = null;
while ((output = br.readLine()) != null) {
everything.append(output);
}
responseData = everything.toString();
}
} catch (JsonProcessingException e) {
throw new Auth0Exception("Could not create Auth0 Login Body", e);
} catch (IOException e) {
throw new Auth0Exception("Error with Login API", e);
} finally {
if (conn != null) {
conn.disconnect();
}
}
return responseData;
}
Run Code Online (Sandbox Code Playgroud)
现在,我非常习惯进行真正的集成测试,即对 Web 服务进行真正的调用并检查结果。
现在我被要求严格使用 Mockito,而不是 PowerMockito,而不是 EasyMock 来创建模拟测试,而我以前从未这样做过。我对 Mockito 的了解也很薄弱,因为我已经很长时间没有使用它了。
所以,我知道以前有人问过这个问题,而且我确实在互联网上进行了搜索,但我确实没有找到完整的代码作为示例。我看到的代码片段让我缺少了一些部分,而且我的知识不足以自己添加这些部分。
我知道这段代码的实际实现工作正常,并且集成测试也工作正常。但是,我之前看到的是,一些用户被告知他们需要更改客户端代码才能使 mockito 测试正常工作。
如果我没有让模拟测试适用于 HTTPUrlConnection,那么我将被迫切换到 RestTemplate 和 Mocking,因为我的同事坚持认为我们无论如何都要使用 RestTemplate。
谢谢!
由于您要求提供一个没有意义但应该展示想法的小示例:
import java.io.IOException;
import java.io.UncheckedIOException;
import java.net.HttpURLConnection;
import java.net.URL;
public class App {
public int status(URL url) {
HttpURLConnection urlConnection = null;
try {
urlConnection = create(url);
return urlConnection.getResponseCode();
} catch (IOException e) {
throw new UncheckedIOException(e);
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
}
}
HttpURLConnection create(URL url) throws IOException {
return (HttpURLConnection) url.openConnection();
}
}
Run Code Online (Sandbox Code Playgroud)
我会用间谍来实现这个,正如我推荐的那样HttpURLConnection:
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoExtension;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
@ExtendWith(MockitoExtension.class)
class AppTest {
@Spy
App app;
@Mock
HttpURLConnection connection;
@Test
void status() throws IOException {
int expected = 200;
doReturn(connection).when(app).create(any());
doReturn(expected).when(connection).getResponseCode();
URL url = new URL("http://www.google.ats");
int status = app.status(url);
Assertions.assertEquals(expected, status);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12460 次 |
| 最近记录: |