java mockito: есть ли способ подделать класс, который не существует? - PullRequest
2 голосов
/ 05 апреля 2019

Я хочу подделать новый тип класса, который не существует, который реализует интерфейс

возможно ли это?

например, у меня есть интерфейс

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, но на самом деле его не существует

от NOT существует, я имею в виду, что нет определения для:

public class FakeWorker implement Worker 

причина, по которой я хочу издеваться над другим классом, заключается в том, что тип работника уникален

public addWorker(Worker worker) {
    childWorkers = childWorkers.stream().filter(w -> w.getClass() != worker.getClass())
                                                     .collect(Collectors.toList());
    childWorkers.add(worker)
}

1 Ответ

1 голос
/ 05 апреля 2019

Во-первых, выбрал имена, которые проясняют, что такое тестируемая система (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
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...