【发布时间】:2019-03-19 20:08:38
【问题描述】:
我正在尝试使用 Spring Reactive 编程创建一个非常基本的 Rest API,并且我还想尝试使用 Reactive Stack 进行测试。
但是,当我尝试测试服务实现时,我得到一个空指针错误,这发生在我调用任何类型的操作方法后,例如:doNext、flatMap、block 等(以 userService.save(user) 的形式.doNext、userService.save(user).flatMap、userService.save(user).block() 等)
您可以在以下 github 存储库中找到完整的代码和 gradle 设置: https://github.com/mesarikaya/restAPI
您的帮助将不胜感激。
如果您想快速浏览一下,下面是测试代码:
@Slf4j
@ExtendWith(MockitoExtension.class)
public class UserServiceTest {
@Mock
private UserRepository userRepository;
private User existingUser;
private User newUser;
private User returnUser;
private Logger logger = LoggerFactory.getLogger(UserServiceTest.class);
@InjectMocks
private UserServiceImpl userService;
@BeforeEach
public void setUp() {
System.out.println("@Beforeeach is called!");
MockitoAnnotations.initMocks(this);
// Create Existing Account
existingUser = new User();
existingUser.setEmail("abc@gmail.com");
existingUser.setFirstName("First");
existingUser.setMiddleName("Middle");
existingUser.setLastName("Last");
existingUser.setActive(true);
existingUser.setMobileNumber("021234234");
existingUser.setVerified(false);
existingUser.setPermalink("abcgmailcom");
Address address1 = new Address();
address1.setStreetName("asda");
address1.setHouseNumber("asd");
address1.setCity("asdasd");
address1.setCountry("asdasd");
address1.setZipcode("sasd123");
existingUser.setAddress(address1);
// New User
// Create Existing Account
newUser = new User();
newUser.setFirstName("NewFirst");
newUser.setMiddleName("NewMiddle");
newUser.setLastName("NewLast");
newUser.setActive(true);
newUser.setMobileNumber("0123123");
newUser.setVerified(false);
newUser.setOauthId("123123123");
Address address2 = new Address();
address2.setStreetName("ADress2");
address2.setHouseNumber("asda");
address2.setCity("asdsad");
address2.setCountry("asd");
address2.setZipcode("asdasd");
newUser.setAddress(address2);
// newUser.setId((ObjectId) new ObjectIdGenerator().generate());
userService.saveOrUpdateUser(existingUser);
userService.saveOrUpdateUser(newUser);
System.out.println("Existing user: " + existingUser);
System.out.println("New User: " + newUser);
}
@Test
public void findUser(){
User user = userService.saveOrUpdateUser(existingUser).block();
Mono<User> userMono = userService.saveOrUpdateUser(existingUser);
StepVerifier
.create(userMono)
.assertNext(u -> {
assertEquals(existingUser.getEmail(), u.getEmail());
assertEquals(existingUser.getLastName() , u.getLastName());
})
.expectComplete()
.verify();
assertEquals(user.getEmail(), existingUser.getEmail());
assertEquals(user.getId(), existingUser.getId());
}
}
这是错误信息:
仅供参考 - 存储库已被识别:com.mes.gotogether.repositories.UserRepository$MockitoMock$612061122
java.lang.NullPointerException 在 com.mes.gotogether.services.UserServiceImpl.saveOrUpdateUser(UserServiceImpl.java:56) 在 com.mes.gotogether.services.UserServiceTest.setUp(UserServiceTest.java:77) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:566) 在 org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:532) 在 org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115) 在 org.junit.jupiter.engine.descriptor.ClassTestDescriptor.invokeMethodInExtensionContext(ClassTestDescriptor.java:436) 在 org.junit.jupiter.engine.descriptor.ClassTestDescriptor.lambda$synthesizeBeforeEachMethodAdapter$14(ClassTestDescriptor.java:424) 在 org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeBeforeEachMethods$2(TestMethodTestDescriptor.java:136) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72) 在 org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeBeforeMethodsOrCallbacksUntilExceptionOccurs(TestMethodTestDescriptor.java:156) 在 org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeBeforeEachMethods(TestMethodTestDescriptor.java:135) 在 org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:110) 在 org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:59) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$4(NodeTestTask.java:108) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:98) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:74) 在 java.base/java.util.ArrayList.forEach(ArrayList.java:1540) 在 org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$4(NodeTestTask.java:112) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:98) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:74) 在 java.base/java.util.ArrayList.forEach(ArrayList.java:1540) 在 org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$4(NodeTestTask.java:112) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:98) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:74) 在 org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) 在 org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) 在 org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) 在 org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:220) 在 org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:188) 在 org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:202) 在 org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:181) 在 org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128) 在 com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:74) 在 com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) 在 com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) 在 com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
【问题讨论】:
标签: java spring testing junit reactive-programming