Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用jUnit和Mockito进行外部REST API调用的单元测试_Java_Spring_Unit Testing_Junit_Mockito - Fatal编程技术网

Java 使用jUnit和Mockito进行外部REST API调用的单元测试

Java 使用jUnit和Mockito进行外部REST API调用的单元测试,java,spring,unit-testing,junit,mockito,Java,Spring,Unit Testing,Junit,Mockito,我正在Spring Boot Java应用程序中为服务类构建单元测试 服务类对RESTAPI服务进行外部调用,该服务返回JSON响应。我正在用Mockito模拟这个呼叫。我正在mockserver响应中硬编码一个JSON 在单元测试中使用硬编码JSON是一种糟糕的做法吗?如果JSON结构发生变化,那么我的推理是测试应该失败。有没有更好的最佳实践可以做到这一点 下面的示例片段: 实际的代码是功能性的,我只是为了简洁起见编辑了这段代码,以便让大家理解,所以如果您看到任何错误,请发表评论: 公共类Us

我正在Spring Boot Java应用程序中为服务类构建单元测试

服务类对RESTAPI服务进行外部调用,该服务返回JSON响应。我正在用Mockito模拟这个呼叫。我正在mockserver响应中硬编码一个JSON

在单元测试中使用硬编码JSON是一种糟糕的做法吗?如果JSON结构发生变化,那么我的推理是测试应该失败。有没有更好的最佳实践可以做到这一点

下面的示例片段:

实际的代码是功能性的,我只是为了简洁起见编辑了这段代码,以便让大家理解,所以如果您看到任何错误,请发表评论:

公共类UserServiceTest扩展了TestCase{
私有静态最终字符串MOCK_URL=“baseUrl”;
私有静态最终字符串DEFAULT\u USER\u ID=“353”;
测试中的用户服务类;
反应性模仿反应性;
MockRestServiceServer-mockServer;
@嘲弄
rest模板mockrest模板;
public void setUp()引发异常{
super.setUp();
classUnderTest=新的UserRestService();
mockRestTemplate=新建RestTemplate();
mockServer=MockRestServiceServer.createServer(mockrestemplate);
ReflectionTestUtils.setField(测试中的类,“restTemplate”,
模板);
ReflectionTestUtils.setField(测试中的类,“userSvcUrl”,
模拟网址);
}
public void testGetUserById()引发异常{
expect(requestTo(MOCK_URL+“/Users/”+DEFAULT_USER_ID)).andExpect(method(HttpMethod.GET))
.安德烈(成功地)(
“{\n”+
“\”用户凭据\“:{\n”+
“\”密码\“:\”\,\n”+
“\“PasswordNeedsUpdate\”:false,\n”+
“\'Security\”:[\n”+
“{\n”+
“\”答案\“:\”,\n”+
“\”问题\“:\”自行车为什么摔倒?\“\n”+
“}\n”+
“]\n”+
"}"
,MediaType.APPLICATION_JSON));
Customer=classUnderTest.getUserById(默认用户ID);
mockServer.verify();
assertNotNull(客户);
assertEquals(默认用户ID,customer.getId());
}
}

我现在和你在同一条船上,我的理由如下: 创建一个伪JSON响应就像模拟一个对象并使用
Mockito.when
控制它。您需要更改
when()中的任何内容。然后返回()
当您更改某些内部解析或期望得到不同结果时调用。这与JSON响应相同,在JSON响应中,调用被更改,对象表示被更改

因此,我的猜测是这样可以。阅读关于测试REST API的各种文章,大家普遍认为创建伪JSON响应是一种好的做法。最佳做法是(不时地)下载真正的JSON响应并将其作为模拟响应插入。这样,您可以与外部方保持测试的最新状态,而测试可以在没有internet请求的情况下运行

按要求编辑:

  • 红宝石-

  • 蟒蛇-

  • JavaScript-

  • 蟒蛇-


< P>我想对另一种方法进行启发,即创建JSON表示的对象的POJO(例如,数据模型,JavBean),然后使用JSON序列化程序,如谷歌的Gson,将其转换成JSON字符串。

UserCredentials uc = new UserCredentials ();
//set the values
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(uc);

嘿,Tim,你介意编辑你的帖子吗?你使用的一些资源仅供参考?你好,Anataliocs,我已经添加了一些我找到的参考资料。希望它们能帮助你=]太棒了,非常感谢。这让我对我的方法更有信心,因为糟糕的单元测试几乎比他们说的没有测试更糟糕;)我甚至没有想到这一点。我非常喜欢这种方法。感谢您的输入。JUnit告诉我安装方法必须是静态的。在哪里定义了withSuccess()方法?问题-您的classUnderTest是公开/Users/API还是从外部服务调用外部REST端点(/Users/)?
UserCredentials uc = new UserCredentials ();
//set the values
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(uc);