我的主要班级是这样的:
class MyClass{
String bar(String inputString){
String url = "https:x.y.z/p/q"; //the URL is framed dynamically based on other class attributes
final String payloadInJson = getPayload(inputString)
final String response = doPostRequest(url, payloadInJson)
}
private static String doPostRequest(final String url, final String postData) throws IOException {
final RequestBody body = RequestBody.create(JSON, postData)
final Request request = new Request.Builder()
.url(url)
.post(body)
.build()
final Response response = createOkHttpClient().newCall(request).execute()
if (!response.isSuccessful()) {
throw new RuntimeException("...")
}
response.networkResponse().header("Location")
}
private static OkHttpClient createOkHttpClient() {
Config config = new ConfigBuilder()
.withTrustCerts(true)
.build()
def httpClient = HttpClientUtils.createHttpClient(config)
httpClient = httpClient.newBuilder().authenticator(Authenticator.NONE).build()
httpClient
}
}
“我的消费者”测试用例是:
@SpringBootTest(classes = Application.class)
@AutoConfigureStubRunner(stubsMode = StubRunnerProperties.StubsMode.LOCAL, ids = ["com.ex:foobar:+:stubs:8090"])
class MyClassTest{
@Inject
private MyClass myClass
def 'happyPath'(){
given:
...
when:
String res = myClass.bar('lorem...')
}
}
问题是如何模拟OkHttp URL并使用localhost? 还是在测试用例中,我可以引用带有框架的实际URL?
答案 0 :(得分:2)
如果您使用Spring Cloud Contract,我们将在给定或随机端口上启动HTTP服务器。您只需将OK Http Client设置为指向启动的服务器即可。例子
伪代码:
class MyClass{
private String url = "https:x.y.z/p/q";
String bar(String inputString){
final String payloadInJson = getPayload(inputString)
final String response = doPostRequest(this.url, payloadInJson)
}
// package scope
void setUrl(String url) {
this.url = url;
}
}
然后在测试中,您可以设置存根的端口和URL
测试(再次使用伪代码):
@SpringBootTest(classes = Application.class)
@AutoConfigureStubRunner(stubsMode = StubRunnerProperties.StubsMode.LOCAL, ids = ["com.ex:foobar"])
class MyClassTest{
@Inject
private MyClass myClass
@StubRunnerPort("foobar") int stubPort;
def 'happyPath'(){
given:
myClass.url = "http://localhost:${stubPort}"
when:
String res = myClass.bar('lorem...')
}
}
更好的选择是使用适当的@Configuration
类,在其中定义bean并通过构造函数注入URL。无论如何,希望它能向您显示如何解决该问题。