java mockito:有没有办法伪造一个不存在的类?
我想伪造一个不存在的新类型的类,它实现了一个接口java mockito:有没有办法伪造一个不存在的类?,java,testing,mockito,Java,Testing,Mockito,我想伪造一个不存在的新类型的类,它实现了一个接口 public interface Worker { boolean execute(Job c); } 这可能吗 例如,我有一个接口 public interface Worker { boolean execute(Job c); } 我有一节课 public class CompositeWorker implements Worker { private List<Worker> childWorke
public interface Worker {
boolean execute(Job c);
}
这可能吗
例如,我有一个接口
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)
}
}
我之所以要模拟另一个类,是因为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
}
}
公共类复合市场测试{
接口WorkerA扩展了Worker{};
接口WorkerB扩展Worker{};
@嘲弄
WorkerA workerAMock;
@嘲弄
WorkerB workerBMock;
@嘲弄
工作模拟;
//正在测试的系统
私人合成工sut;
@预处理法
无效设置(){
initMocks(this);
sut=新的CompositeWorker();
}
@试验
无效测试_worker(){
当(workerAMock.execute(jobMock)),然后返回(true);
当(workerBMock.execute(jobMock)),然后返回(true);
sut.add(workerAMock);
sut.add(workerBMock);
列表结果=sut.execute(jobMock);
//断言结果包含true
}
}
您可以在test@jonathanHeindl是的,那将是我的选择,如果我不能通过Mockito完成,为什么你需要一个不同的课程?为什么不覆盖所有方法(Mockito.spy创建一个与原始类类似但可mockable的mock),这样它就不会返回null作为default@ealeon,您能解释一下为什么要模拟一个不存在的类吗?“可能还有其他方法可以实现您想要实现的目标。@DavidV刚刚更新了问题。这是因为addWorker有一个检查,所以我在测试中不能模拟多个类型
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
}
}