【问题标题】:How to hide internal testing method from client without breaking change如何在不破坏更改的情况下向客户隐藏内部测试方法
【发布时间】:2019-01-16 08:32:15
【问题描述】:

最初我有一个包含所有方法的类。 (这不是正确的语法,但应该足以证明我想要做什么)

class A {
  public static class1
  public static method1
  public static var1
  ...
  public testmethod2
  public testvar2
  ...
}

在这种情况下我会这样做

import static com.example.A.class1;
import static com.example.A.method1;

在其他类中导入。

但是我想对客户端隐藏 testMethods。所以我对代码进行了一些重组,使其根据 buildType 使用不同版本的 A 类(在不同的文件中)

class A_shared {
  public static class1
  public static method1
  public static var1
  ...
}

在调试中:

class A extends A_shared {
  public testmethod2
  public testvar2
  ...
}

发布中:

class A extends A_shared {

}

效果很好。人们仍然可以在没有注意到任何变化的情况下使用 A 类。 但是对于class1,我必须导入 A_shared 而不是 A 而对于静态方法和变量我仍然可以使用 A 来导入。

import static com.example.A_shared.class1;
import static com.example.A.method1;

我错过了什么吗? 在我重构代码之后,Java/Android 中是否可以从 A 导入 class1,这样我就不会在客户端破坏任何东西?

如果不可能,那么...
1. 有没有更好的方法来实现重组,以隐藏基于不同类型的构建/风格的特定方法(变量),同时不破坏客户端的任何内容?
2.我很好奇为什么只有class1必须与超类一起导入而其他静态方法和vars不需要。

感谢您的任何想法。

2018 年 8 月 9 日更新:
我应该详细说明我们的用例。
我正在为我们的 Android 应用程序开发人员提供一个库,以包含在 gradle 依赖项中。

该应用有两个版本。
在调试版本中,他将包含调试版本的库,其中包含所有测试方法和变量,以便他可以显示应用程序的内部状态。
在发布版本(它上升到游戏商店)中,他使用了库的发布版本,所有测试内容都被剥离了。

对于某些测试方法,我们运行它以进行内部基准测试以集成测试我们的库。它们不在应用程序的生产版本中运行。这些测试方法和变量用于监控和基准测试。

我们的客户在他们自己的应用程序中使用库 (SDK) 的发布版本。

【问题讨论】:

  • 接口的默认方法是没有问题的,因为它只支持超过 api 级别 24。

标签: java android architecture


【解决方案1】:

恕我直言,我会让方法/成员 protected 表明它们不是该类的公共 API 的一部分,但会将它们与您和其他人放在同一个类中/作为类的设计行为的文档而受益。但是,这使客户(不正确地?)使用这些方法?

请注意,大多数人的约定是单元测试在src/test/java/package/ 下,用于src/main/java/package/ 中的代码,所以如果您在主类中有任何测试方法,它们应该非常具体仅供测试类检查和使用的钩子,如果可能,可能会避免使用。

扩展一个类以增加可测试性可能是个坏主意 - 会增加代码的复杂性并不必要地增加类的大小。

另一个问题是这些测试方法的目的——它们只是用于单元测试吗?还是在生产(或类似生产)环境中进行测试? IE。它们是应用程序操作和监控的一部分吗?还是仅用于构建时测试?

【讨论】:

  • 您好,感谢您的回复。客户不应使用这些方法,因为它没有记录在案,因此如果他们不正确地使用这些测试方法,我们不在乎破坏它们。对于其他问题,我已经更新了问题。如果您还不清楚,请告诉我。谢谢!
  • 假设使用 Gradle,请参见此处:thoughtfulsoftware.wordpress.com/2014/01/26/… - 与单元测试相同的理念,将测试代码放在 src/intTest/pkg 等下。
猜你喜欢
  • 2012-05-30
  • 2011-12-29
  • 2016-07-03
  • 2010-12-21
  • 2011-03-11
  • 2019-02-28
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
相关资源
最近更新 更多