也许我缺少一些东西,有人可以告诉我为什么这个单元测试用例不起作用吗?
谢谢。
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());
}
答案 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
}