gpt4 book ai didi

java - 为了测试而将方法包或私有(private)化是不好的做法吗?

转载 作者:行者123 更新时间:2023-11-29 07:42:26 26 4
gpt4 key购买 nike

在 Java 中(在特定于 Android 的上下文中,但这应该全面适用),删除 private 修饰符是否被认为是不好的做法 - 因此是 package具体 - 为了单元测试?

假设我有如下内容:

public void init(long id) {
mId = id;
loadItems(1);
}

public void refresh() {
loadItems(mId);
}

private void loadItems(int page) {
// ... do stuff
}

在这种情况下,我有 2 个绝对应该测试的公共(public)方法。值得关注的是,refresh()init() 方法几乎完全相同,只是减去了处理 id 的一些逻辑。

loadItems() 编写单元测试似乎是最简单的,然后只需验证 init()refresh() 使用适当的 id(使用类似 Mockito 的东西)调用 loadItems()。但是,没有一种“好方法”来测试私有(private)方法。

这样做会让我成为一个糟糕的软件开发人员吗?我知道从技术上讲,私有(private)方法不需要单元测试,但这将是一种简单的测试方法,IMO,尤其是在 loadItems() 有点复杂的情况下。

最佳答案

你问“这样做会让我成为一个糟糕的软件开发人员吗?”

我不认为这会让你成为一个糟糕的开发者。例如,如果您查看 .NET,它们甚至有一种方法允许其他库查看另一个库的内部结构以进行单元测试 (InternalsVisibleTo)。

不过,我个人反对测试私有(private)方法。在我看来,单元测试应该在可见方法而不是私有(private)方法上进行。测试私有(private)方法在某种程度上违背了封装的意义,并且仅仅为了单元测试而使方法比需要的更可见在我看来是错误的。

如果我是你,我会测试我的两个公共(public)方法。今天,您的两个方法几乎完全相同,并且通过使其包可见来更容易地测试您的私有(private)方法。然而明天,情况可能不再如此。由于这两种方法都是公共(public)的并且其他类可以轻松访问,因此如果发生这种情况并且两者偏离,您可能正在测试错误的东西。

更好的是(这是我推荐的)移动

private void loadItems(int page) {
// ... do stuff
}

它自己的类有自己的接口(interface),然后使用单独的单元测试测试 loadItems(int page) 一次,然后通过确保它们使用参数调用接口(interface)来测试两个公共(public)方法你在期待这样,您就可以测试整个代码并避免我在上面解释的陷阱。

关于java - 为了测试而将方法包或私有(private)化是不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28818735/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com