Как проверить класс, который реализует Runnable с Junit - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть класс реализует Runnable, как это

  public Processor implements Runnable{

  public void run() {
     while (true) {
     //some code
     sendRequest(object);
      }
   }
}

 public void sendRequest(Object, object){
 // do something to send the event
  }
}

И в других классах предварительной нагрузки. Я использую

Processor processor = new Processor();
ExecutorService executor = Executors.newCachedThreadPool();
executor.execute(processor)

Итак, мой вопрос, как я могу вызвать юнит-тест метода sendRequest или нет?

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

Я полагаю, что вы хотите протестировать только реализованный метод run(), поэтому вы можете вызывать метод напрямую, используя объект Processor, или вы можете создать поток и передать ему работающий объект и вызвать Thread.start()

* 1005.* Если sendRequest(Object object) метод выполняет какие-либо внешние операции, я предлагаю вам смоделировать этот метод
public class ThreadTest {

@Test(//throws some exception)
public void shouldThrowSomeException() {
    Processor exThread = new Processor ();
    exThread.run(); //or
    Thread t = new Thread(exThread);
     t.start()

    }
}

Насмешка для насмешки здесь

@Test(//throws some exception)
public void shouldThrowSomeException() {
    Processor exThreadmock = mock(Processor.class);
    when(exThreadmock.sendRequest(anyObject))
    .thenThrow(SomeException.class)
    Thread t = new Thread(exThread);
     t.start()

    }
0 голосов
/ 13 ноября 2018

Разделите проблемы: Runnable и связанная логика.
Это дополнительно сделает ваш код тестируемым.
Вы можете извлечь sendRequest() в класс Foo, от которого зависит класс Processor. Затем вам нужно просто смоделировать этот класс Foo в своем тесте и убедиться, что метод sendRequest() был вызван.

Например:

 public Processor implements Runnable{

  private Foo foo;

  public Processor(Foo foo){
    this.foo = foo;
  }

  public void run() {
     while (true) {
       //some code
       foo.sendRequest(object);
     }
   }
}

И тест:

@Mock
Foo fooMock;

@Test
public void run() {
    Processor processor = new Processor(fooMock);
    ExecutorService executor = Executors.newCachedThreadPool();
    executor.execute(processor);
    executor.awaitTermination(someTime, TimeUnit.SECONDS);
    Mockito.verify(fooMock).sendRequest(...);   
}
0 голосов
/ 13 ноября 2018

Используйте Mockito.spy для частичной насмешки.

Processor processor = spy(new Processor());

doCallRealMethod().when(processor).run();

verify(processor).sendRequest(mock1, mock2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...