gpt4 book ai didi

java - 在 Mockito 中模拟对象创建的不同方式?

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

我看到了几种不同的模拟对象的方法。使用 InjectMocks 的方法与此处显示的方法之间到底有什么区别:https://github.com/mockito/mockito/wiki/Mocking-Object-Creation

@ExtendWith(MockitoExtension.class)
public class MyTest() {
@Mock ClassB uut;
@InjectMocks ClassA cA;
@Test
public TestOne() {
...
}
}

哪里

public class ClassA() {
public ClassA() {
ClassB temp = new ClassB();
}
}

与此处显示的方法相比: https://github.com/mockito/mockito/wiki/Mocking-Object-Creation

到底有什么区别?

最佳答案

我认为这些方法之间没有本质区别。

InjectMocks 方法

实际上,要使其正常工作,您的类应该通过构造函数或 setter 接受依赖项(并且它永远不会同时适用于两者)。我想说这种方法使测试更容易,因为您可以在初始化阶段将您想要的任何内容注入(inject)到类对象中。

class Foo {
private final Bar bar;

public Foo(final Bar bar) {
this.bar = bar;
}
}

如果这是我们正在测试的类,那么 @InjectMock 所做的就是创建模拟,并执行以下操作:

Foo foo = new Foo(barMock);

除了可测试之外,想象一下如果 Bar 是一个接口(interface),那么您可以在它的多个实现之间进行切换,而无需实际接触类代码(理想情况下)。如果您有 DI 框架,那就更容易了。所以,基本上这种类的格式使它变得灵活。

使用单行方法创建对象

假设这是我们正在测试的类。如您所见,我正在构造函数内初始化该属性。从法律上讲,没有反射魔法,我无法在初始化期间或之后放置模拟 bar 变量。

class Foo {
private final Bar bar;

public Foo() {
this.bar = new Bar();
}
}

Mockito 文档告诉您切换到单行方法或工厂助手的原因是:

  • Mockito 无法模拟构造函数,这意味着您无法在没有反射的情况下将模拟对象放在 bar 的位置,并且只能在初始化之后执行此操作。一般来说,以我对测试的观点来看,应该尽可能避免反射。
  • 单行函数看起来和构造函数一样干净,并且可以具有描述性(如静态工厂方法)。

因此,当您将类(class)切换为如下所示时:

class Foo {
private final Bar bar;

public Foo() {
this.bar = makeBar();
}

Bar makeBar() {
return new Bar();
}
}

现在,您可以放置​​一个 spy ,并且只需轻松模拟 makeBar 方法即可。这同样适用于工厂方法。老实说,工厂方法对我来说看起来有点啰嗦,但我仍然相信有时它会派上用场。

关于java - 在 Mockito 中模拟对象创建的不同方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62455831/

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