首页 > 解决方案 > 模拟实例方法

问题描述

也许我遗漏了一些东西,有人能告诉我为什么这个单元测试用例不起作用吗?

谢谢。

import java.util.Random;


public class A {
    private B b;

    public A() {
        b = new B();
    }

    public int methodA() {
        return b.methodB();
    }

}

// 只返回一个随机数

class B {
    public int methodB() {
        return new Random().nextInt();
    }
}

// 这是我的测试方法,它不打印 20

    @Test
    public void testMethodA() {
        B b = Mockito.mock(B.class);
        Mockito.when(b.methodB()).thenReturn(20);

        A a = new A();
        System.out.println(a.methodA());
    }

标签: javajunitmockito

解决方案


该类A实例化了它自己的实例B,因此永远不会使用您的模拟实例。相反,您可以重构A的构造函数以获取对象的工厂或将在内部使用B的实例。B

要执行您最初描述的操作,您可以使用 PowerMock 完全替换该方法。

@PrepareForTest(B.class)
@RunWith(PowerMockRunner.class)
public class MyTests {
    @Test
    public void myTest {
        // Make B.methodB always return 20
        PowerMock.stub(PowerMock.method(B.class, "methodB")).toReturn(20);
    }
}

推荐阅读