我是Mockito的新手,我有个问题。假设我尝试在测试方法中有一个对象示例。我知道我可以用 @Mock 这是因为我们试图将测试从对象方法中分离出来。但是,为了控制测试分支,我确实需要在这个对象中设置一些值。我还应该用吗 Mock 或者干脆用新的 Object() 如何示例化它?还是没关系(每种方式都很好)?谢谢。
@Mock
Mock
Object()
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框架。
static const
mocked.STATIC_CONST
mocked
final
1条答案
按热度按时间m2xkgtsf1#
让我们看看,好吗?!
以上照片:
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框架。