У меня есть следующие классы / интерфейсы:
public interface Api {
Mono<Object> update();
}
@Service
public class Service {
@Autowired
private Api api;
private List<Object> list;
public void update() {
api.update().subscribe(result -> list.add(result), Throwable::printStackTrace);
}
}
Я пытаюсь выполнить модульный тест, используя Mockito для функции потребителя, когда я подписываюсь на Mono, который возвращается моим Апи. Пока что мой тестовый класс выглядит следующим образом
@RunWith(SpringRunner.class)
@SpringBootTest
public class ServiceTest {
@Mock
private Mono<Object> mono;
@MockBean
private Api api;
@Autowired
private Service service;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testUpdate() {
when(api.update()).thenReturn(mono);
doAnswer((Answer<Void>) invocation -> {
System.out.println("FOO");
Consumer<Object> consumer = invocation.getArgument(0);
consumer.accept(testObject)
return null;
}).when(mono).subscribe(any(Consumer.class), any(Consumer.class));
service.update();
}
}
Во-первых, я вижу, что код внутри doAnswer () никогда не вызывается. Во-вторых, поскольку метод Mockito any () возвращает значение NULL, а получатель ошибок функции подписки ожидает ненулевое значение, я запускаю NullPointerException при запуске моего теста.
Каков наилучший подход к выполнению модульного тестирования моего функция подписчика?