gpt4 book ai didi

java - 模拟同一个类中的其他公共(public)方法是一个好习惯吗

转载 作者:行者123 更新时间:2023-12-02 10:43:39 24 4
gpt4 key购买 nike

例如:

public class NumberService {

public boolean isNaturalNumber(int num) {
return num > 0;
}

public String getClassificationInfo(int num) {
return isNaturalNumber(num) ? num + "is a natural number" : num + "is not a natural number";
}
}

这里有两个公共(public)方法,方法getClassificationInfo调用了方法isNaturalNumber

在测试 getClassificationInfo 时模拟 isNaturalNumber 是一个好习惯吗?

像这样:

    @RunWith(MockitoJUnitRunner.class)
public class NumberServiceTest {

@Spy
private NumberService numberService;

@Test
public void test_getClassificationInfo_when_is_natural_number() {
int num = generateInt();

doReturn(true).when(numberService).isNaturalNumber(num);

String classificationInfo = numberService.getClassificationInfo(num);

assertThat(classificationInfo).isEqualTo(num + "is a natural number");
}

@Test
public void test_getClassificationInfo_when_is_not_natural_number() {
int num = generateInt();

doReturn(false).when(numberService).isNaturalNumber(num);

String classificationInfo = numberService.getClassificationInfo(num);

assertThat(classificationInfo).isEqualTo(num + "is not a natural number");
}

// the other test for isNaturalNumber

private int generateInt() {
return new Random().nextInt();
}
}

最佳答案

在这种特殊情况下,模拟所调用的方法是没有意义的。然而,这不仅仅是因为它是同一类的方法。事实上,有时会专门引入同一个类的方法,以允许它们被模拟。例如,如果在类中处理通过文件 I/O 获取的一些数据,则可以将文件 I/O 隔离到其自己的方法中。然后,您可以使用文件 I/O 方法的模拟版本来测试数据处理。

但是,在这种情况下,没有充分的理由在 getClassificationInfo 测试中模拟 isNaturalNumber:方法 isNaturalNumber 具有确定性行为,并且不会导致执行时间过长。通过模拟 isNaturalNumbergetClassificationInfo 的一项测试中故意表现错误的情况,您似乎也不太可能获得太多 yield 。

你不必教条地 mock 一切。例如,您也不要模拟 sincos 等标准库数学函数,因为它们在大多数情况下也不会导致问题。 mock 应该是有原因的。因此,如果您考虑模拟函数或方法,您应该知道您要解决哪个问题。如果没有问题需要解决,就不要 mock 。

关于java - 模拟同一个类中的其他公共(public)方法是一个好习惯吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52751732/

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