gpt4 book ai didi

java - 使用 Mockito 进行单元测试 - 忽略方法调用

转载 作者:搜寻专家 更新时间:2023-11-01 02:49:00 24 4
gpt4 key购买 nike

我正在努力学习 Mockito 来对应用程序进行单元测试。下面是我目前正在尝试测试的方法的示例

public boolean validateFormula(String formula) {

boolean validFormula = true;
double result = 0;

try {
result = methodThatCalculatAFormula(formula, 10, 10);
} catch (Exception e) {
validFormula = false;
}

if (result == 0)
validFormula = false;
return validFormula;
}

此方法调用同一类中的另一个方法,methodThatCalculatAFormula,我不想在单元测试 validateFormula 时调用它。

为了对此进行测试,我想看看此方法的行为取决于 methodThatCalculatAFormula 返回的内容。因为它在 result 为 0 时返回 false,如果它是 0 以外的任何数字则返回 valid 我想模拟这些返回值而不运行实际的 methodThatCalculatAFormula 方法。

我写了以下内容:

public class FormlaServiceImplTest {
@Mock
FormulaService formulaService;

@Before
public void beforeTest() {
MockitoAnnotations.initMocks(this);
}

@Test
public void testValidateFormula() {

`//Valid since methodThatCalculatAFormula returns 3`
when(formulaService.methodThatCalculatAFormula(anyString(),anyDouble(),anyDouble(),anyBoolean())).thenReturn((double)3);
assertTrue(formulaService.validateFormula("Valid"));



//Not valid since methodThatCalculatAFormula returns 0
when(formulaService.methodThatCalculatAFormula(anyString(),anyDouble(),anyDouble(),anyBoolean())).thenReturn((double)0);
assertFalse(formulaService.validateFormula("Not Valid"));
}

然而,当我运行上面的代码时,我的 assertTruefalse。我猜我在模拟设置中做错了什么。我将如何通过模拟 methodThatCalculatAFormula 的返回值而不实际调用它来测试上述方法。

最佳答案

你想做的不是模拟而是 spy (部分模拟)。您不想模拟一个对象,而只想模拟一种方法。

这个有效:

public class FormulaService {
public boolean validateFormula(String formula) {

boolean validFormula = true;
double result = 0;

try {
result = methodThatCalculatAFormula(formula, 10, 10);
} catch (Exception e) {
validFormula = false;
}

if (result == 0)
validFormula = false;
return validFormula;
}

public double methodThatCalculatAFormula(String formula, int i, int j){
return 0;
}
}

public class FormulaServiceImplTest {

FormulaService formulaService;

@Test
public void testValidateFormula() {

formulaService = spy(new FormulaService());
// Valid since methodThatCalculatAFormula returns 3`
doReturn((double) 3).when(
formulaService).methodThatCalculatAFormula(anyString(),
anyInt(), anyInt());
assertTrue(formulaService.validateFormula("Valid"));

// Not valid since methodThatCalculatAFormula returns 0
doReturn((double)0).when(
formulaService).methodThatCalculatAFormula(anyString(),
anyInt(), anyInt());
assertFalse(formulaService.validateFormula("Not Valid"));
}
}

但是你不应该使用 spy 。您应该将类​​重构为两个,以便您可以针对另一个的模拟来测试一个。

关于java - 使用 Mockito 进行单元测试 - 忽略方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15390422/

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