gpt4 book ai didi

Java:模拟调用外部库来测试构造函数

转载 作者:行者123 更新时间:2023-11-29 08:30:40 25 4
gpt4 key购买 nike

我正在尝试对以下 ClassA 类的 ClassA(String) 构造函数进行单元测试:

import ExternalObject;

class ClassA{

private ExternalObject externalObject;

public ClassA() {
super();
}

public ClassA(String string) {
super();
this.externalObject = new ExternalObject().parseString(string);
}
}

我想模拟 newExternalObject().parseString(string) 调用并使用示例 ExternalObject 对象对其进行 stub 。

我研究过 Mockito,但似乎 Mockito 无法完成此任务,因为:

  • Mockito 只能模拟方法,不能模拟方法内的语句。
  • Mockito 要求在模拟对象之前先创建对象。 Mockito needs an instance of the class before you can begin mocking 。因此,即使我将 newExternalObject().parseString() 调用放在 ClassA 类中的单独方法中,如果没有 ClassA 实例,我也无法调用它。

是否可以在 Mockito(或任何其他模拟库)中执行此操作,而无需重写大量代码?我愿意对代码进行小的更改,以使其更易于测试。

最佳答案

为了模拟 ExternalObject,您必须能够提供测试流程中使用的 ExternalObject 实例。

只要 ExternalObject 是在 public ClassA(String string) 内部创建的,这就会很困难。

为了使您的 ClassA 更易于测试,您需要能够在构造 ClassA 时提供 ExternalObject 的实例。

例如:

class ClassA{

private ExternalObject externalObject;

public ClassA() {
super();
}

public ClassA(ExternalObject externalObject, String string) {
super();
this.externalObject = externalObject.parseString(string);
}
}

然后可以按如下方式进行测试:

public class ClasssATest {

@Test
public void someTest() {
String input = "a string";
ExternalObject externalObject = Mockito.mock(ExternalObject.class);
Mockito.when(externalObject.parseString(eq(input))).thenReturn(externalObject);

ClassA sut = new ClassA(externalObject, input);
...
}
}

这里的关键点是:将外部依赖项注入(inject)到您的类中。一旦进行此更改,测试就会变得更加容易,而且更一般地说,这种方法可以更轻松地通过换入/换出该外部依赖项的实现来更改系统行为。

关于Java:模拟调用外部库来测试构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48496354/

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