【发布时间】:2022-06-19 17:28:14
【问题描述】:
说明:
我已经测试了methodA() 和methodB(),所以我可以确定它们都被覆盖了。
通过模拟同一文件中的methodA() 和methodB() 来测试methodToBeTested() 的方法是什么?参数通过methodToBeTested() 传递给methodA() 和methodB(),以使用注入正确测试这些方法。
注意:它们是计算服务的相关逻辑,并且这些方法已经原子地分离,因此不能被提取到不同的类中。
代码:
class ClassForTesting {
int methodToBeTested(String a, String b) {
// Calculation in this method also is a bit more difficult
return methodA() + methodB();
}
int methodA(String a) {
int value = 1;
// Here is calculation logic that has been tested
return value;
}
int methodB(String b) {
int value = 2;
// Here is calculation logic that has been tested
return value;
}
}
做了什么: 我尝试了 Mockito 的几种方法,但它不允许这样做:
-
@GenerateMocks- 正在创建一个模拟,并要求我使用when()存根每个方法,甚至是methodToBeTested()。 - 通过使用下一个构造扩展 Fake:
class Mock extends Fake implements PasswordValidatorService {}
但是通过这种方式,我只继承了PasswordValidatorService's 行为而不是实现,并且每个未覆盖的方法都会抛出UnimplementedError。因此,我无法覆盖 methodToBeTested() 并调用它的超级实现。
我发现 Mockito for Java 具有 @Spy 构造,在这种情况下会很完美,但不幸的是它不适用于 Dart 和 Flutter。
我目前来的唯一方法是创建自己的 Mock:
class MockClassForTesting extends ClassForTesting {
@override
int methodA() {
return 2;
}
@override
int methodB() {
return 5;
}
}
但是这个实现不允许我使用 Mockito 的when() 构造灵活性,因为我必须有不同的methodA() 和methodB() 返回。
这一事实迫使我在 MockClassForTesting 中添加额外的变量来实现 when() 构造功能。
问题:
- 实现我的目标的最佳方式是什么?
- 在小部件测试期间可以使用相同的模拟方法吗?
【问题讨论】:
-
您可以创建自己的派生类,覆盖
methodA和methodB,并将这些特定的覆盖委托给Mock实现。 -
@jamesdlin 第一部分已经完成并在问题中描述,但第二部分我不明白。这是我在 Flutter 中进行单元测试的第一天。您的意思是对 MockClassForTesting 使用 GenerateMocks?
-
我的意思是两件事都做:创建自己的派生类并像往常一样创建
Mock,然后使用混合方法,派生类使用Mock来获取特定方法。
标签: flutter android-studio unit-testing dart mockito