我有一个TestClass,我正在为TestClass的calculate()方法编写单元测试用例。请参考下面的代码。
public class TestClass {
public int calculate() {
System.out.println("calculating area");
String shape = getShape(1);
int radius = 10;
int result = findArea(shape, radius);
return result;
}
public String getShape(int index) {
if(index == 1) {
return "circle";
}
else {
return "square";
}
}
public int findArea(String shape, int radius) {
if(shape == "circle") {
return 3 * radius * radius;
}
else {
return radius * radius;
}
}
}
虽然模拟getShape()函数,但我希望该模拟在传递值1时返回“平方”。请参考下面的unittest。
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.Before;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
public class TestClassTest {
//TestClass testClass;
@Before
public void init() {
TestClass testClass = new TestClass();
System.out.println("Inside before");
}
@Test
public void calculateTest() {
int expected = 100;
TestClass testClass = new TestClass();
TestClass testClassMock = Mockito.mock(TestClass.class);
Mockito.when(testClassMock.getShape(1)).thenReturn("square");
int actual = testClass.calculate();
assertEquals(expected, actual);
}
}
测试失败,出现错误,预期为100,但为300。因此很明显,getShape(1)返回值圆,而不是我使用Mockito.when()提供的值。请让我知道我正在犯什么错误。在此先感谢
您正在嘲笑一个对象,但是您从不使用该嘲笑。看来您打算以模拟getShape
的方式监视(即部分模拟)被测对象,但calculate
的实际实现称为:
@Test
public void calculateTest() {
int expected = 100;
TestClass testClass = Mockito.spy(new TestClass());
Mockito.doReturn("square").when(testClass).getShape(1);
int actual = testClass.calculate();
assertEquals(expected, actual);
}