Тестовый класс Java Spring Reactive Rest API выдает ошибку - исключение нулевого указателя - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь создать очень простой API отдыха, используя программирование Spring Reactive, и я хотел также попробовать возможности тестирования с помощью Reactive Stack.

Однако, когда я пытаюсь протестировать реализацию службы, я получаюОшибка нулевого указателя, и это происходит после того, как я вызываю любой метод действия, например: doNext, flatMap, block и т. Д. (В форме userService.save (user) .doNext, userService.save (user) .flatMap, userService.save (user) .block () и т. д.)

Полный код и настройки gradle можно найти в следующем репозитории github: 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());
    }
}

Вот сообщение об ошибке:

FYI- Репозиторий распознан: com.mes.gotogether.repositories.UserRepository $ MockitoMock $ 612061122

java.lang.gotogether.services.UserServiceTest.setUp (UserServiceTest.java:77) в java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (нативный метод) в java.base / jdk.internal.reflect.NativeMethol: 62) в java.base / jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.base / java.lang.reflect.Method.invoke (Method.java:566) в org.jun.platform.commons.util.ReflectionUtils.invokeMethod (ReflectionUtils.java:532) в org.junit.jupiter.engine.execution.ExecutableInvoker.invoke (ExecutableInvoker.java:115) в org.junit.jupiter.engine.descriptDor.Class.invokeMethodInExtensionContext (ClassTestDescriptor.java:436) по адресу org.junit.jupiter.engine.descriptor.ClassTestDescriptor.lambda $ synthesizeBeforeEachMethodAdapter $ 14 (ClassTestDescriptor.estjethoho.jetho.org.de.DB.MDB.WD.WD.WD.WD.WD.Emp_Med_D_D_W_D_W_D_D_W_D_W_E_D_T_0_t_0_t_t_t_.TestMethodTestDescriptor.java:136) в org.junit.platform.engine.support.hierarchical.TestMethodTestDescriptor.invokeBeforeEachMethods (TestMethodTestDescriptor.java:135) в org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute (TestMethodTestcripteshoho.jetTjorTjTorTj.TjTenTecT.MDTM.WD.WD.WD.WD.WD.WD.WD.WD.WD.WD.WD.WD.WD.WD.WD.WD.WD.WD.WD.WD.WD.WD.WD.WD.WD.WD.WD.W.S.Med.W.59) в org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda $ executeRecursively $ 4 (NodeTestTask.java:108) в org.junit.platform.engine.support.hierarchical.ThrowableCollector.ableolCollectorjableol () в org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively (NodeTestTask.java:98) в org.junit.platform.engine.support.hierarchical.NodeTestTask.execute (NodeTava.Text).base / java.util.ierarchical.NodeTestTask.lambda $ executeRecursively $ 4 (NodeTestTask.java:112) в org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute (ThrowableCollector.java:72) в org.form.suunit.pl..NodeTestTask.executeRecursively (NodeTestTask.java:98) в org.junit.platform.engine.support.hierarchical.NodeTestTask.execute (NodeTestTask.java:74) в java.base / java.urayforEjLray: 1540) at 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)

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Для тех, кто менее знаком с Mocks и Stubs и кто хочет понять, почему в моем случае возникает исключение NullPointer, есть хорошая статья, которая объясняет случай.https://reflectoring.io/unit-testing-spring-boot/

Вот мое решение проблемы, с которой я столкнулся: - Метод испытаний адаптирован к следующему:

 @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 голосов
/ 19 марта 2019

Ваш сервис получает Mono<User> из вашего репозитория и вызывает block() на Mono (что само по себе является плохой идеей, но это уже другая история).

Ваш тест вводит фиктивный репозиторий в сервис, но вы никогда не говорите имитату ничего возвращать при вызове его метода findByUserId.Так что возвращается ноль.И вызов block() в null создает исключение NullPointerException.

...