【问题标题】:NullPointer Exception during testing of upsert method in Java在 Java 中测试 upsert 方法期间出现 NullPointer 异常
【发布时间】:2021-07-27 02:27:37
【问题描述】:

我有一个方法可以像这样更新 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);
       
       
    }

当我运行/调试此测试方法时,会在 cmets 中涉及的行抛出 NullPOinterException。
谁能告诉我我在这里做错了什么?非常感谢。

【问题讨论】:

  • 显示 UpdateResult 类代码
  • @bimjhi,这是一个 mongo 客户端类:mongodb.github.io/mongo-java-driver/3.6/javadoc/com/mongodb/…
  • 提供的信息还不够。我们不知道您的 main 方法以及您初始化 updateResult 引用的方式。
  • 除了测试方法中显示的内容外,我没有在代码中的任何地方初始化 updateResult。
  • 这段代码是用java编写的API的一部分。有一个控制器方法,我们通过它接收 someDTOObject 作为主体。我将相同的对象发送到存储库以在数据库中更新。

标签: java nullpointerexception mockito mono


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 2020-07-31
    相关资源
    最近更新 更多