【发布时间】:2021-04-06 14:05:53
【问题描述】:
我在对功能进行单元测试时遇到问题。
public User[] fetchUserByStarsAscendingOrder(String username) throws IOException {
User[] user = fetchUser(username);
Arrays.sort(user,Collections.reverseOrder());
return user;
}
public User[] fetchUser(String username) throws IOException {
URL url = new URL("https://api.github.com/users/" + username + "/repos");
InputStreamReader reader = new InputStreamReader(url.openStream());
User[] user = new Gson().fromJson(reader, User[].class);
if (user == null) {
logger.error("No input provided.");
return null;
} else {
logger.info("The output returned.");
return user;
}
}
上述方法在我的 API 中运行良好,没有任何问题。
但是当我尝试在我的测试类中使用它时,使用相同的参数...它突然返回 null:
class UserServiceTest {
UserService userService;
User aUser;
@Test
void shouldReturnArray() throws IOException {
//given
String name = "pjhyett";
//when
User[] resultArray = userService.fetchUserByStarsAscendingOrder(name);
//then
assertThat(resultArray[0]).isEqualTo(aUser);
}
@BeforeEach
void setUp() {
aUser = new User();
aUser.setFull_name("pjhyett/github-services");
aUser.setDescription("Moved to http://github.com/github/github-services");
aUser.setClone_url("https://github.com/pjhyett/github-services.git");
aUser.setStars(408);
aUser.setCreatedAt("2008-04-28T23:41:21Z");
}
以上所有数据均取自 GitHub API,是关于公共 repos 的。我正在寻找数组中的第一个元素,因为该方法返回了数组的几个结果。
IDE 告诉我,在 API 本身中完美运行的方法...在测试类中返回 null。
这是为什么呢?
【问题讨论】:
-
猜测:您的测试基础设施与您的应用程序上下文不匹配。您说“单元测试”,但提供模拟网络请求的证据。因此,这似乎是需要您的整个应用程序上下文才能运行的集成测试。
-
你不嘲笑任何东西,那样它就不能按你的意愿工作
-
您能详细说明一下吗?如何检查我的测试基础设施和我的应用程序上下文是否匹配?我有其他应用程序在结构上看起来基本相同或相似,只有在这里我有问题。我应该嘲笑这种方法什么?我为测试方法提供了一个测试用例,它应该与方法返回的内容与其当前 URL 完全匹配。
-
就像其他人指出的那样,这并不是真正的单元测试。但是,在当前的测试设置中,您永远不会实例化
UserService,所以我猜这是导致 NPE 的原因。 -
确实,实例化 UserService 解决了我的问题...没有更多的 null 现在我将尝试以另一种方式进行测试本身 - 我将尝试实际测试我的代码在给定的情况下的行为基本上没有测试外部 API 的输入。非常感谢您的帮助。 :) @Wouter van der Linde,您可以将此评论作为答案发布,这样我就可以将其标记为解决问题的评论。
标签: java testing gson inputstreamreader