应该将使用@mock注解的对象设置为详细值吗?

xa9qqrwz  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(503)

我是Mockito的新手,我有个问题。假设我尝试在测试方法中有一个对象示例。我知道我可以用 @Mock 这是因为我们试图将测试从对象方法中分离出来。但是,为了控制测试分支,我确实需要在这个对象中设置一些值。我还应该用吗 Mock 或者干脆用新的 Object() 如何示例化它?还是没关系(每种方式都很好)?
谢谢。

m2xkgtsf

m2xkgtsf1#

让我们看看,好吗?!

import org.mockito.Mockito;

class Scratch {  
    public final static String STATIC_CONST = "static const";
    private final String JUST_CONST = "private const";
    protected String protectedField = "protected field";
    String packageProtectedField = null;

    public static void main(String[] args) {
        Scratch mocked = Mockito.mock(Scratch.class);
        System.out.println("static    = " + mocked.STATIC_CONST);
        System.out.println("const     = " + mocked.JUST_CONST);
        System.out.println("protected = " + mocked.protectedField);
        System.out.println("package   = " + mocked.packageProtectedField);

        mocked.packageProtectedField = "but now";
        System.out.println("updated  = " + mocked.packageProtectedField);
    }
}

以上照片:
static=静态常量
const=专用const
受保护=空
包=空
更新=但现在
一些想法:
显然 static const 真的是你所期望的(我曾经 mocked.STATIC_CONST 但是,它是静态的,所以值不是从 mocked 但从零开始(不管怎样,类定义)。
有一点令人惊讶,至少对我来说,分配模拟对象的字段实际上是有效的。但请注意:原来课堂上的作业只对这一点有效 final 现场。换句话说:mockito得到了正确的结果,但对于非final字段是不正确的。
更令人惊讶的是,可以将值存储到mock中。。。
但老实说,这些都无关紧要。你看,在一个合理的设计中,你所有的可变字段首先应该是私有的。这种可变状态表示对象的绝对核心。任何外部代码都不应该处理这些问题!换句话说:理想情况下,即使您的测试也不关心对象的内部状态(在非常罕见的情况下,使用包保护的getter方法访问内部状态以便于验证可能是有意义的,但这应该是一个罕见的例外)。
除此之外:当您模拟一个对象时,您绝对不应该以任何方式处理该模拟的字段。你看:所有的模拟方法。。。它们与类中的原始源代码无关。它们只是:可以使用相应的mockito方法配置/验证的空shell。让我们理解一下:模拟对象中字段的实际内容无关紧要:因为通常处理这些字段的方法不存在“!
所以,长话短说:如图所示,模拟对象可以携带状态。但正如所解释的:你应该完全忽略这一方面。使用mock的唯一正确方法是指定/验证对它们的方法调用。
最后:我希望easymock、powermock(ito)也有类似的行为。另一方面,当其他模拟框架的行为实际上略有不同时,我也不会感到惊讶。我只使用mockito进行了测试,因为在2018年,mockito是为jvm编写单元测试时唯一应该使用的mocking框架。

相关问题