【发布时间】:2017-07-21 14:50:49
【问题描述】:
我正在尝试运行一个测试用例,它将数据更新到数据库中。这是我的测试方法源代码。
@Tested // This is class-level scope as I have different test methods.
FirstLevelClass firstLevelClass;
@Test
public void testUpdateDB(@Mocked SecondLevelClass secondLevelClass) throws Exception {
// Updated method by passing an argument.
firstLevelClass.updateDatabaseThroughSecondLevelClass(info);
new Verifications() {{
SecondLevelClass.updateDB(creds, data);
times =1;
}};
我的目的是验证对模拟方法的预期调用[记录在期望中]。但是,验证块给出以下异常消息。如果我删除 times=1,那么测试用例就会成功。这不是我想要的结果。谁能告诉我我的测试用例可能出了什么问题。
mockit.internal.MissingInvocation:缺少 1 次调用: SecondLevelClass#updateDB(信用,数据) 带参数:信用,数据
原因:缺少调用
更新问题:
updateDatabaseThroughSecondLevelClass(info) 有一个参数,根据该参数,我们在 SecondLevelClass 中形成 creds 引用。
Credentials creds = info.getCredentials();
但是在验证块[这是 FirstLevelClass 的一部分]我们已经在本地创建了测试对象。
Credentials creds = getCredsTestObject();
这就是它抱怨Missing invocations的原因。因为两者都是两个类中的两个不同引用。谁能建议我如何处理这种情况。
提前致谢。
【问题讨论】:
-
creds和data来自哪里?我猜它们与从updateDatabaseThroughSecondLevelClass实际传递给updateDB的值不同,因此您会得到“缺少的调用”。顺便说一句,最新版本的 JMockit 不再有NonStrictExpectations类;此外,如果要在测试结束时进行验证,那么记录这种期望是没有意义的(这是多余的)。此外,@Tested自己创建一个实例,无需显式执行。花几分钟阅读文档,有很多例子。 -
Rogerio,请阅读我更新后的问题,并提出任何处理此案的方法。
-
该问题仍然缺少基本信息:
info、creds和data在用于测试之前是如何创建的?如果显示FirstLevelClass的代码也会有所帮助。
标签: java unit-testing testng jmockit