java - java mockito:有没有办法伪造一个不存在的类?
问题描述
我想伪造一种不存在的实现接口的新型类
这可能吗?
例如,我有一个界面
public interface Worker {
boolean execute(Job c);
}
我有一堂课
public class CompositeWorker implements Worker {
private List<Worker> childWorkers = new ArrayList<>();
public List<boolean> execute(Job j){
return childWorkers.stream().map(w -> w.execute(j)).collect(Collectors.toList());
}
public addWorker(Worker worker) {
childWorkers.add(worker)
}
}
去测试:
public class CompositeWorkerTest {
private CompositeWorker worker;
@BeforeMethod
void setup() {
MockitoAnnotations.initMocks(this);
worker = new CompositeWorker();
}
@Test
test_worker() {
Worker worker_A = mock(Worker.class);
Worker worker_A = mock(Worker.class);
Job job = mock(Job.class);
when(worker_A.execute(job)).thenReturn(true);
when(worker_B.execute(job)).thenReturn(true);
worker.add(worker_A);
worker.add(worker_b);
List<boolean> results = worker.execute(job);
//assert results contains true
}
有没有办法伪造/更改Worker worker_A = mock(Worker.class);
哪个FakeWorker fakeWorker = mock(FakeWorker.class)
实现 Worker 但它实际上并不存在
不存在,我的意思是没有定义:
public class FakeWorker implement Worker
我想模拟一个不同的班级的原因是因为工人类型是独一无二的
public addWorker(Worker worker) {
childWorkers = childWorkers.stream().filter(w -> w.getClass() != worker.getClass())
.collect(Collectors.toList());
childWorkers.add(worker)
}
解决方案
首先,选择清楚什么是被测系统(sut)和什么是模拟依赖项的名称!此外,在使用.initMocks()方法时,在许多情况下您不需要调用Mockito.mock() ,只需将类成员注释为@Mock!在您的情况下,尽管我建议在您的测试类中创建扩展 Worker 的嵌套类:
public class CompositeWorkerTest {
interface WorkerA extends Worker {};
interface WorkerB extends Worker {};
@Mock
WorkerA workerAMock;
@Mock
WorkerB workerBMock;
@Mock
Job jobMock;
// systemm under test
private CompositeWorker sut;
@BeforeMethod
void setup() {
MockitoAnnotations.initMocks(this);
sut = new CompositeWorker();
}
@Test
void test_worker() {
when(workerAMock.execute(jobMock)).thenReturn(true);
when(workerBMock.execute(jobMock)).thenReturn(true);
sut.add(workerAMock);
sut.add(workerBMock);
List<boolean> results = sut.execute(jobMock);
//assert results contains true
}
}
推荐阅读
- events - 未捕获的错误:返回的值无效,是否耗尽了 Gas?
- javascript - 使用 recompose 实用程序作为元素
- ios - 如何从 swift 代码打开 waze carpool 应用程序?
- c# - 如何实现 ASP.NET Core 中间件以删除请求 URL 中重复斜杠的实例?
- javascript - 如何从 Vue 实例中读取数据
- couchbase-java-api - Couchbase 2.5 SDK Java 元类型问题
- javascript - 从 ReactJS 中的 .map 函数访问类方法
- c# - C# 在循环中用值填充数组
- python - 复数/分支割的自变量的数值稳定性
- java - 如何获取一分钟处理窗口的最新记录