Junit Mockito模拟无法正常工作

问题描述 投票:0回答:1

我有一个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()提供的值。请让我知道我正在犯什么错误。在此先感谢

java spring-boot junit mockito powermock
1个回答
0
投票

您正在嘲笑一个对象,但是您从不使用该嘲笑。看来您打算以模拟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);
}
© www.soinside.com 2019 - 2024. All rights reserved.