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
  }
}