在 Java 中测试 upsert 方法期间出现 NullPointer 异常

NullPointer Exception during testing of upsert method in Java

我有一种方法可以像这样更新 MongoDB 中的数据:

public Mono<SomeDTO> DoAction(SomeDTO someDTOObject) {
        return findUser(someDTOObject.getUsername())
                .flatMap(existingUser -> {
                    Update update = new Update();
                   
                    return mongoTemplate.upsert(
                            Query.query(Criteria.where("username").is(someDTOObject.getUsername())),
                            update,
                            SomeDTO.class,
                            COLLECTION_NAME)
                            .flatMap(updateResult -> {              /////// exception thrown from here
                                if(updateResult.wasAcknowledged())
                                    return Mono.just(existingUser);
                                else
                                    return Mono.error(new Exception("Unable to update customer"));
                            });                            

                }).switchIfEmpty(
                        Mono.defer(() -> {
                            return Mono.error(new Exception("User Name doesn't exist."));
                        })
                );
    }
    

以上方法的测试方法是这样的:

@Test
    public void DoAction_TestException() {
        SomeDTO someDTOObject = databaseUtil.SomeDTOMock;        

        Query query = Query.query(Criteria.where("username").regex("^"+userId+"$","i"));
        doReturn(Mono.empty()).when(mongoTemplate).findOne(query,
                SomeDTO.class, "COLLECTION_NAME");
        
        UpdateResult acknowledged = UpdateResult.acknowledged(1, 1L, null);

        doReturn(Mono.just(acknowledged)).when(mongoTemplate).upsert(
                Query.query(Criteria.where("username").is(userId)),
                update,
                SomeDTO.class,
                "COLLECTION_NAME");
        
        SomeDTO someDTOObjectResult = mongoImpl.DoAction(someDTOObject).block();
        
        assertEquals(someDTOObject, someDTOObjectResult);
       
       
    }

当我run/debug这个测试方法时,在注释中提及的行抛出 NullPOinterException。
谁能告诉我我在这里做错了什么?非常感谢。

只是为了关闭一个问题并根据评论。你的问题发生的原因是你的模拟 upsert 没有调用。这可能是因为您在方法中传递的 mock 和参数的预期参数不同。如果传递特定参数对您来说不重要,您可以尝试将参数更改为 any()