【发布时间】:2015-03-02 20:18:34
【问题描述】:
在 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 个公共方法绝对应该进行测试。令人担忧的是,refresh() 和 init() 方法几乎相同,只是减去了一些处理 id 的逻辑。
似乎最简单的方法是为loadItems() 编写单元测试,然后验证init() 和refresh() 是否使用适当的ID 调用loadItems()(使用类似Mockito 的东西)。不过,测试私有方法并没有“好方法”。
这样做会让我成为一个糟糕的软件开发人员吗?我知道私有方法在技术上不应该需要单元测试,但这将是一种简单的测试方法,IMO,尤其是在 loadItems() 有点复杂的情况下。
【问题讨论】:
-
也许您当前的课程违反了Single Responsibility Principle?例如,您可以创建一个可以测试的专用
ItemsLoader类,并将此类的(模拟)实例注入当前类。更准确地说,我错过了一些上下文。 -
嗯...我想后续问题可能是“什么时候创建一个新的类矫枉过正?”这显然有点模糊。你和@kha 本质上是在推荐同样的东西。
-
+1。也许(我不确定)如果你能把它变成一个正确的问题,它可能适合 [Programmers SE](programmers.stackexchange.com)。不过不要忘记先试用搜索功能:)
-
@loeschg 这是我工作过的公司的一个矛盾点。有人说如果要测试的方法是私有的,那么它们不应该在这个类中。有些人只是使用了一个允许测试私有方法的测试框架。但是改变可见性水平是相当糟糕的——这种方法从未被设计成突然出现在公共合同中。程序员的普遍共识是你不测试私有方法。
-
当您想测试私有方法时,首先要问自己的是为什么它是私有的?。你有 99% 的机会回答因为应该在其他班级。因此,对其进行保护、测试、重构以将其提取到一个新类中并在原始类中创建一个私有协作者。
标签: java android unit-testing junit mockito