私有最终字段的断言

问题描述 投票:0回答:1

我有一个带有私有最终哈希图作为缓存的服务。人们访问此服务是为了获取一些信息。每次用户触发此操作时,如果经过一段时间或用户第一次访问该服务,缓存可能会更新。

用户A触发服务,他的信息存储在缓存中。 用户 B 也触发了该服务,并且他的信息也存储在缓存中。

两个用户都不会获得其他用户的信息。 对于我的单元测试,我想检查这两个信息是否都保存在缓存中。

我知道我可以在测试中使用反射来访问数据。 但是还有其他方式访问数据吗? 顺便说一句,我正在使用mockito。

我不想增加该领域的知名度。 我不想使用包私有 getter 方法公开信息。 我不想使用 spring bean 配置机制来注入缓存。

java spring testing junit mockito
1个回答
0
投票

你想要的根本不是java的工作原理。

最佳可行的折衷方案如下:

  1. 始终将测试特定类的任何测试代码(例如单元测试;任何其他测试,例如集成测试,没有您想要的业务测试内容

    private
    ,因此这一点对于其他任何东西来说都是没有意义的)完全相同的包。这并不意味着您必须将测试类与主类混合在一起;而是意味着您必须将测试类与主类混合在一起。你可以例如。有
    src/main/my/pkg/MyCache.java
    与实际代码,以及
    src/test/my/pkg/TestMyCache.java
    测试它;它们都在包中
    my.pkg
    但不在同一个源目录中。

  2. 通过该设置,您的测试代码可以查看并调用

    MyCache
    中的任何包私有实体。因此,将您想要测试的包设为私有(根本没有访问修饰符;只有
    void foo() {}
    (没有
    public
    /
    protected
    /
    private
    )。

  3. 可能想要将该方法注释为

    @VisibleForTesting
    。此注释不在核心 java 中,但许多实用程序存储库都有它。从 API 方面设计得相当好的 guavajetbrains 的“box-o-annotations”库。这些注释本身不执行任何操作,但它们至少是人类可读的(它们的字面意思是“测试可见”),并且各种工具可能会意识到这些注释。这就是注释的用途。工具可以阅读的评论。例如,编写一些工具来检查是否从源文件外部而不是从
    @VisibleForTesting
    根调用
    src/test
    方法并不困难。您需要使用此类注释向项目添加依赖项(或自己编写);请注意,Android 开发包含一些开箱即用的番石榴式的东西,其中包括
    @VisibleForTesting

即使你愿意,反思也不是正确的答案;它会产生难以阅读的代码,并且 JDK21+ 基本上破坏了反射(好吧,它仍然按照规范现在所说的那样进行,但是该规范填补了相当多的空白,一旦涉及模块系统和其他东西,就会导致各种麻烦。你..不想去那里,除非作为最后的手段)。

但是我真的不想!

那么你根本无法测试你的方法。

© www.soinside.com 2019 - 2024. All rights reserved.