模拟实例方法

时间:2019-06-14 17:19:36

标签: java junit mockito

也许我缺少一些东西,有人可以告诉我为什么这个单元测试用例不起作用吗?

谢谢。

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());
    }

3 个答案:

答案 0 :(得分:0)

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);
    }
}

答案 1 :(得分:0)

注入豆类时可以使用模拟。在这里,您将手动创建B类实例。因此,您的模拟游戏在这里无效。

答案 2 :(得分:0)

您的A类确实很难测试,因为您正在B的构造函数中创建A的实例。正如jspcal所建议的那样,您可以使用PowerMock来实现所需的功能。但是,我建议更改您的A类的设计:

public class A {
    private B b;

    public A(B b) {
        this.b = b;
    }

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

}

现在您的课程A易于测试,并且您可以注入B类的模拟或间谍-取决于您要实现的目标:

@Test
public void myTest {
    B bMock = Mockito.mock(B.class);
    Mockito.when(b.methodB()).thenReturn(10);

    A a = new A(bMock);

    int result = a.methodA();

    //assert that result is valid
}