在 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()
我有一种方法可以像这样更新 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()