在 spring webflux 应用程序的单元测试中模拟存储库时出错(使用 JUnit 和 Mockito)?

Error when mocking a repository in unit test of a spring webflux application (using JUnit and Mockito)?

提问人:divad 提问时间:11/8/2022 最后编辑:divad 更新时间:11/9/2022 访问量:443

问:

我还没有找到解决这个问题的方法。

我的测试类:

@WebFluxTest(controllers = {PatronController.class})
@Import({PatronService.class}) //to satisfy PatronController dependency.
@ExtendWith({PatronParameterResolver.class})
class PatronFunctionsSpec {
    private Patron patron;
    private Mono<Patron> patronMono;
    private final PatronService patronService = Mockito.mock(PatronService.class);
    @MockBean
    private PatronRepository patronRepository;

    @Autowired
    private WebTestClient client;

    @BeforeEach
    void init(Patron injectedPatron) {
        patron = injectedPatron;
        patronMono = Mono.just(patron);
    }

    //Patron Story: patron wants to create an account with us
    @Nested
    @DisplayName("Creating a patron.")
    class CreatingPatron {

        @Test
        @DisplayName("PatronService.create() returns success msg in Response obj after creating patron.")
        void getResponseObjFromServiceCreate() {
            Flux<Patron> patronFlux = Flux.from(patronMono);
            Mockito.when(patronRepository.saveAll(patronMono)).thenReturn(patronFlux);

            PatronService patronService = new PatronService(patronRepository);
            Mono<Response> responseStream = patronService.create(Mono.just(patron));
            Mono<Response> expectedResponseStream = Mono.just(new Response("Welcome, patron. Can't show emojis yet -- sorry."));

            assertEquals(expectedResponseStream, responseStream);
        }
    }
}

请参阅我的 PatronService 类及其代码:

@Service
public class PatronService {

    private final PatronRepository patronRepository;

    public PatronService(PatronRepository patronRepository) {

        this.patronRepository = patronRepository;

    }

    /**
     *
     * persists patron via PatronRepo
     */
    public Mono<Response> create(Mono<Patron> patronMono) {
        patronRepository.saveAll(patronMono).subscribe();
        return Mono.just(new Response("Welcome, patron. Can't find the emojis yet -- sorry."));
    }
}

我正在测试 PatronService 的 create(),因此需要分别模拟和存根 PatronRepository 及其函数。但问题是:运行测试用例后,我得到这个异常: java.lang.NullPointerException:无法调用“reactor.core.publisher.Flux.subscribe()”,因为“patronFlux”为空 在 com.budgit.service.PatronService.create(PatronService.java:26)

我该如何解决这个问题?

Spring 单元测试 mockito spring-webflux junit5

评论

1赞 M. Deinum 11/8/2022
我认为你的服务中的代码也是错误的(你不应该调用 subscribe,而应该让链端带有你的返回值,这样你最终可以调用 subscribe。话虽如此,您的问题中的信息太少(或至少只是零散的)信息无法回答这个问题。
0赞 divad 11/8/2022
你好Denium先生。感谢您的回复。让我实现这一点。
1赞 M. Deinum 11/8/2022
如前所述,这里的信息太少了。您是如何测试的(从问题中不清楚,因为它包含来自测试中不同位置的行)。而且你不应该在任何地方打电话。subscribe
1赞 M. Deinum 11/8/2022
你的 mockin 不匹配,因为两者之间存在序列化,因此它是与你比较的不同 flux 实例,导致 mocking 的默认行为启动,即返回 .null
1赞 M. Deinum 11/9/2022
您正在调用控制器,您的初始调用将从 Mono 转换为 JSON,然后从 JSON 转换回 Mono。因此,它是 Mono 的一个不同实例,然后 ou 正在嘲笑(尽管内容可能相同),因此存根的匹配不起作用。

答: 暂无答案