gpt4 book ai didi

flutter - 如何验证方法内部的方法在 mockito 中被调用

转载 作者:行者123 更新时间:2023-12-02 01:31:12 25 4
gpt4 key购买 nike

我在使用 mockito 进行 flutter 单元测试时,感觉无法验证在另一个方法中调用了一个方法。我到目前为止编写的代码如下,

我要测试的类

class A {
void doSomething() {
callMe();
}

void callMe() {}
}

模拟类

class MockA extends Mock implements A {}

我写的测试,

test("Test method is called", () {
A a = new MockA();
a.doSomething();
verify(a.callMe()).called(1);
});

当我运行上述测试时出现错误

No matching calls. All calls: MockA.doSomething()
(If you called `verify(...).called(0);`, please instead use `verifyNever(...);`.)

如果我验证 doSomething 被调用它有效,但对于 doSomething 中的 callMe 调用无效。这是默认行为还是我做错了什么?请注意,我需要验证在调用 doSomething() 时调用了 callMe() 方法。

最佳答案

您模拟了 A 并将其替换为 MockA。模拟没有实现。 MockA.doSomething() 什么都不做并且不会也不能调用 MockA.callMe()

A.doSomething() 调用A.callMe() 应被视为doSomething() 的实现细节;使测试依赖于它会将测试与特定实现紧密耦合并且会很脆弱。

您不能使用模拟来验证被模拟事物的实现。如果您想验证 A.doSomething() 的实现,您应该使用实际对象并验证该对象的可观察属性。

但如果您仍然真的想这样做,那么您需要修改 A 以不对其自身调用方法,而是对提供的对象调用方法(即“依赖注入(inject)”) .例如:

class A {
final late A a;

A({A? a}) {
this.a = a ?? this;
}

void doSomething() {
a.callMe();
}

void callMe() {}
}

test("Test method is called", () {
var mockA = MockA();
var actualA = A(a: mockA);
actualA.doSomething();
verify(mockA.callMe()).called(1);
});

然而,类依赖于自身的模拟有点不寻常,如果您随后想要验证 callMe() 发出的调用,则它不会扩展。

另一种可以更好地扩展(但需要更多工作)的方法是创建您自己的跟踪方法调用的假类:

class TrackedA implements A {
int doSomethingCallCount = 0;
int callMeCallCount = 0;

@override
void doSomething() {
doSomethingCallCount += 1;
super.doSomething();
}

@override
void callMe() {
callMeCallCount += 1;
super.callMe();
}
}

但同样,它非常脆弱,我不推荐它。

关于flutter - 如何验证方法内部的方法在 mockito 中被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73240744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com