Модульное тестирование @ Asynchronous метода в шпионе в Java 7 - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь протестировать какой-то ужасный устаревший код (Java 7)
Мне нужно шпионить за службой без сохранения состояния, но вызвать асинхронный метод

Я получаю ошибку

Объект не представляет фактическое будущее

Как мне попробовать и проверить это?

@InjectMocks
private OrderDataImport spyImporter;

/* has spyImporter as a dependency */
@InjectMocks
private ImportService sut; /* system under test */

@Before
public void setUp() {
    // create spy
    spyImporter = Mockito.spy(new OrderDataImport());
    MockitoAnnotations.initMocks(this);
}

@Test
public Test() {
   sut.import();
}

Код импорта

class ImportService {
   @EJB
   private OrderDataImport dependency;


   public boolean import() {
       List<Future<Result>> resultList = new ArrayList<>();

       int THREAD_COUNT = 3;
       while (THREAD_COUNT-- > 0)
           resultList.add(dependency.create(...));

       for (int i = 0; i < resultList.size(); i++) {
           /* Object does not represent an actual Future */
           Result result = resultList.get(i).get(60, TimeUnit.MINUTES);
       }           
   }
}

Ответы [ 2 ]

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

Вы не должны шпионить за чем-либо еще в вашем тесте, кроме самого SUT.

OrderDataImport - это зависимость, которую вы должны преследовать, а не шпионить.

Вы также должны использовать @InjectMocks только на SUT:

@Mock
private OrderDataImport importerStub;

@InjectMocks
private ImportService sut; 

@Before
public void setUp() {
    MockitoAnnotations.initMocks(this);
}

@Test
public Test() {
   // Arrange
   when(importerStub.create(..)).thenReturn(/* Future instance */);

   // Act
   sut.import();
}

В конце концов, я вижу, что вам не нужно шпионить здесь.

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

Может быть, вам нужен статический метод mockito, когда (), просто попробуйте

doReturn({Future subclass instance}).when({reference spyImporter}).get(anyInt(),xx)

...