我有一个带有私有最终哈希图作为缓存的服务。人们访问此服务是为了获取一些信息。每次用户触发此操作时,如果经过一段时间或用户第一次访问该服务,缓存可能会更新。
用户A触发服务,他的信息存储在缓存中。 用户 B 也触发了该服务,并且他的信息也存储在缓存中。
两个用户都不会获得其他用户的信息。 对于我的单元测试,我想检查这两个信息是否都保存在缓存中。
我知道我可以在测试中使用反射来访问数据。 但是还有其他方式访问数据吗? 顺便说一句,我正在使用mockito。
我不想增加该领域的知名度。 我不想使用包私有 getter 方法公开信息。 我不想使用 spring bean 配置机制来注入缓存。
你想要的根本不是java的工作原理。
最佳可行的折衷方案如下:
始终将测试特定类的任何测试代码(例如单元测试;任何其他测试,例如集成测试,没有您想要的业务测试内容
private
,因此这一点对于其他任何东西来说都是没有意义的)完全相同的包。这并不意味着您必须将测试类与主类混合在一起;而是意味着您必须将测试类与主类混合在一起。你可以例如。有 src/main/my/pkg/MyCache.java
与实际代码,以及 src/test/my/pkg/TestMyCache.java
测试它;它们都在包中 my.pkg
但不在同一个源目录中。
通过该设置,您的测试代码可以查看并调用
MyCache
中的任何包私有实体。因此,将您想要测试的包设为私有(根本没有访问修饰符;只有 void foo() {}
(没有 public
/ protected
/ private
)。
您可能想要将该方法注释为
@VisibleForTesting
。此注释不在核心 java 中,但许多实用程序存储库都有它。从 API 方面设计得相当好的 guava 到 jetbrains 的“box-o-annotations”库。这些注释本身不执行任何操作,但它们至少是人类可读的(它们的字面意思是“测试可见”),并且各种工具可能会意识到这些注释。这就是注释的用途。工具可以阅读的评论。例如,编写一些工具来检查是否从源文件外部而不是从 @VisibleForTesting
根调用 src/test
方法并不困难。您需要使用此类注释向项目添加依赖项(或自己编写);请注意,Android 开发包含一些开箱即用的番石榴式的东西,其中包括 @VisibleForTesting
。
即使你愿意,反思也不是正确的答案;它会产生难以阅读的代码,并且 JDK21+ 基本上破坏了反射(好吧,它仍然按照规范现在所说的那样进行,但是该规范填补了相当多的空白,一旦涉及模块系统和其他东西,就会导致各种麻烦。你..不想去那里,除非作为最后的手段)。
那么你根本无法测试你的方法。