首页 > 解决方案 > 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)
}

标签: javatestingmockito

解决方案


首先,选择清楚什么是被测系统(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
  }
}

推荐阅读