gpt4 book ai didi

java - 单元测试最佳实践 : Empty Constructor or Mock Object?

转载 作者:行者123 更新时间:2023-11-28 20:02:01 24 4
gpt4 key购买 nike

假设我要测试这个依赖于难以实例化的 ClassB 的 Java ClassA:

public class ClassA
{
public ClassA()
{
String configFile = "config_file.xml";

// I have to pass configFile to instantiate ClassB.
// And for example if configFile does not exists in the testing machine?
// Wouldn't it be easier to have an empty constructor for classB to test ClassA?
ClassB classB = new ClassB(configFile);
}

// ...
}

B 类:

class ClassB
{
ClassB(String configFile)
{
// Set up configs.
}

// ...
}

仅出于测试目的在 classB 中创建一个空构造函数是否是不好的做法?还是为此重写一个简化的模拟 ClassB 更好?

最佳答案

看起来你的场景适合 IoC 和依赖注入(inject),使用类似 Spring 的东西或 Guice .

这样 ClassA 就可以声明它“需要”一个 ClassB 的实例,而您的 IoC 容器将连接起来并构建所需的依赖项。

但是,如果你不想在途中得到一个框架,你可以通过从ClassB中提取一个接口(interface)契约来解决它,并让ClassA依赖在此之上,并在其构造函数中接收该合约的实现。

例如:

interface SomeContract {
void someBehavior();
}

ClassB 实现它:

class ClassB implements SomeContract {
{
ClassB(String configFile)
{
// Set up configs.
}

void someBehavior() {
// ...
}
}

并使用它,例如:

public class ClassA
{
private SomeContract implementation;
public ClassA(SomeContract implementation)
{
this.implementation = implementation;
}

// ...
}

这样,在您的单元测试中,您可以传递您在测试中确定的实例,例如 Mock,并且您可以相应地进行测试,而无需修改 ClassB 的代码。

最重要的是,您应该尽量避免创建额外的构造函数以及仅用于测试目的的构造函数。

关于java - 单元测试最佳实践 : Empty Constructor or Mock Object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11071652/

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