gpt4 book ai didi

unit-testing - 使用模拟对象编写可维护的单元测试

转载 作者:行者123 更新时间:2023-12-04 06:50:58 26 4
gpt4 key购买 nike

这是我正在为其编写单元测试的类的简化版本

class SomeClass {

void methodA() {
methodB();
methodC();
methodD();
}

void methodB() {
//does something
}

void methodC() {
//does something
}

void methodD() {
//does something
}
}

在为这个类编写单元测试时,我使用每个方法中使用的 EasyMock 模拟了对象。设置模拟对象及其期望很容易
在方法 B、C 和 D 中。但是要测试方法 A,我必须设置更多的模拟对象及其期望。此外,我正在不同条件下测试方法 A,这意味着我必须以不同的期望多次设置模拟对象。

最后,我的单元测试变得难以维护并且非常困惑。我想知道是否有人已经或看到了解决此问题的好方法。

最佳答案

如果我正确理解您的问题,我认为这是一个设计问题。单元测试的好处在于,编写测试通常会迫使您使您的设计更好。如果您在测试一个方法时需要模拟太多东西,这通常意味着您应该将您的类分成两个更小的类,这将更容易测试(以及编写、维护、修复错误和重用等)。

在您的情况下,方法 A 似乎比方法 A、B、C 处于更高级别。您可以考虑将其删除到更高级别的类,该类将包装 SomeClass:

class HigherLevelClass {
ISomeClass someClass;

public HigherLevelClass(ISomeClass someClass)
{
this.someClass = someClass;
}

void methodA() {
someClass.methodB();
someClass.methodC();
someClass.methodD();
}
}

class SomeClass : ISomeClass {
void methodB() {
//does something
}

void methodC() {
//does something
}

void methodD() {
//does something
}
}

现在,当您测试 methodA 时,您只需要模拟小的 ISomeClass 接口(interface)和三个方法调用。

关于unit-testing - 使用模拟对象编写可维护的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3138949/

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