Spring WebFlux: модульное тестирование подписки на функцию Mono - PullRequest
1 голос
/ 09 марта 2020

У меня есть следующие классы / интерфейсы:

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 при запуске моего теста.

Каков наилучший подход к выполнению модульного тестирования моего функция подписчика?

...