java - 模拟实例方法
问题描述
也许我遗漏了一些东西,有人能告诉我为什么这个单元测试用例不起作用吗?
谢谢。
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());
}
解决方案
该类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);
}
}
推荐阅读
- windows - 比 LogonUser() 更好的身份验证方式
- c - 二维数组的指针算术类型转换(C)
- mysql - MySQL 使用 C API 准备语句中的语法错误
- python - 在 python 中可视化具有(半)不透明的六边形网格的管
- python - python选择列表,然后从获胜列表中选择一个项目
- javascript - 异步函数 - 数据函数应该返回一个对象?
- php - PHP DomDocument - 自结束标记和特殊字符
- angular - 以角度对树节点的子节点进行排序
- php - SQLSTATE[HY000] [2002] 没有这样的文件或目录 (SQL: select * from `users` where `email` = test@test.com limit 1)
- angular - 从 Cloud Firestore 中检索数据