首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java Spring Reactive Rest API测试类出现错误-空指针异常

Java Spring Reactive Rest API测试类出现错误-空指针异常
EN

Stack Overflow用户
提问于 2019-03-20 04:08:39
回答 2查看 1K关注 0票数 -2

我正在尝试使用Spring Reactive编程创建一个非常基本的rest API,我还想尝试使用Reactive Stack进行测试。

然而,当我尝试测试服务实现时,我得到了一个空指针错误,这发生在我调用任何类型的操作方法之后: doNext,flatMap,block等(形式为userService.save(用户).doNext,userService.save(用户).flatMap,userService.save(用户).block()等)。

您可以在以下github存储库中找到完整的代码和gradle设置:

您的帮助我们将不胜感激。

如果你想快速浏览一下,下面是测试代码:

代码语言:javascript
复制
@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

com.mes.gotogether.services.UserServiceImpl.saveOrUpdateUser(UserServiceImpl.java:56) at com.mes.gotogether.services.UserServiceTest.setUp(UserServiceTest.java:77) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native java.lang.NullPointerException ) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at 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.在org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$4(NodeTestTask.java:108) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:98) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:74) at java.base/java.util.ArrayList处执行(TestMethodTestDescriptor.java:59)org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$4(NodeTestTask.java:112) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:98) at org.junit.platform.engine的.forEach(ArrayList.java:1540)。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) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:74) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) at org。junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:220) at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:188) at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:202) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:181) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128) at com.intellij.juit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:74) at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

EN

回答 2

Stack Overflow用户

发布于 2019-03-20 04:18:26

您的服务从您的存储库获取一个Mono<User>并在Mono上调用block() (这本身就是一个坏主意,但那是另一回事)。

您的测试将一个模拟存储库注入到服务中,但是您永远不会告诉模拟在调用其findByUserId方法时返回任何内容。所以它返回null。在null上调用block()会抛出NullPointerException。

票数 0
EN

Stack Overflow用户

发布于 2019-03-22 22:35:27

对于那些不太熟悉Mock和Stub的人,以及想要理解为什么我的情况下会发生NullPointer异常的人,这里有一篇很好的文章解释了这种情况。https://reflectoring.io/unit-testing-spring-boot/

这是我对我遇到的问题的解决方案:-测试方法适用于以下情况:

代码语言:javascript
复制
 @Test
 public void saveUser(){

    when(userRepository.findByUserId(anyString())).thenReturn(Mono.just(existingUser));
    when(userRepository.save(any(User.class))).thenReturn(Mono.just(existingUser));
    User retrievedUser = userServiceImpl.saveOrUpdateUser(existingUser).log().flux().next().block();
    System.out.println("Returned user: " + retrievedUser.getEmail());
    System.out.println("Existing user" + existingUser.toString());
    assertEquals(retrievedUser.getUserId(), existingUser.getUserId());
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55249221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档