当前位置: 首页 > 知识库问答 >
问题:

JUnit5 SpringBootTest NullPointerException测试服务时出现异常

慕光霁
2023-03-14

我遵循一个单元测试服务的教程,我试图使用JUnit5而不是JUnit4(这是教程使用的)。当我完全按照JUnit4的教程操作时,测试工作正常,但是我得到了JUnit5的NullPointerExc0019。

存储库:

java prettyprint-override">public interface CourseRepo extends CrudRepository<Course, Long> {}

服务:

@Service
public class CourseService {

    private final CourseRepo courseRepo;

    public CourseService(CourseRepo courseRepo) {
        this.courseRepo = courseRepo;
    }

    public Course save(Course course) {
        Course newCourse = courseRepo.save(course);
        return newCourse;
    }

}

测试:

package com.elovell.blackboard.service;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;

import com.elovell.blackboard.domain.Course;
import com.elovell.blackboard.repository.CourseRepo;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;

@ExtendWith(MockitoExtension.class)
@SpringBootTest(webEnvironment = WebEnvironment.NONE)
public class CourseServiceTest {

    @Mock
    public CourseRepo courseRepo;

    @InjectMocks
    public CourseService courseService;

    @BeforeEach
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testSaveCourse() {

        Course mockCourse = new Course();
        mockCourse.setPk1(1L);
        mockCourse.setCourseId("ENGL101");

        when(courseRepo.save(any(Course.class))).thenReturn(mockCourse);
        // save(null) should still return mockCourse
        Course newCourse = courseService.save(null);
        assertEquals("ENGL101", newCourse.getCourseId());
    }
}

以下是异常的前几行:

java.lang.NullPointerException
    at com.elovell.blackboard.service.CourseServiceTest.testSaveCourse(CourseServiceTest.java:44)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

生成文件的测试和依赖项部分:

test {
    useJUnitPlatform {
        includeEngines 'junit-jupiter'
    }
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    runtimeOnly 'com.h2database:h2'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation("org.junit.jupiter:junit-jupiter-api:5.5.1")
    testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.1.0")
    testCompile 'org.mockito:mockito-junit-jupiter:2.23.4'
}

共有1个答案

伏建修
2023-03-14

这看起来像是您试图将集成测试与单元测试混合在一起。

当您使用@SpringBootTest注释时,那么Junit5的SpringExent在运行测试之前启动应用程序上下文,并且要在测试中进行模拟,您需要使用@MockBean注释而不是@Mock

如我所见,您只需要一个单元测试,就可以删除SpringBootTest注释。

顺便说一下,我认为你得到了NPE,因为你的any(Course.class)当(当然回购......尝试使用isNull()any()(没有具体类)。

 类似资料:
  • 问题内容: 尝试通过以下代码连接到 openfire 服务器时: 我得到一个异常说: 这可能是什么原因? 注意 :我已经允许openfire消防服务器通过防火墙。我也尝试过关闭防火墙,但是结果相同。服务器是我自己的机器。我尝试在其上运行程序的同一台计算机。 问题答案: 您可以使用 或者如果您想指定端口 或类似,默认为端口5222

  • 不是只使用,我们使用来包装它并完成依赖并在异步过程中执行测试。 使用需要我们返回一个Promise,我们通过调用或者来解决我们的测试的competition ,这取决于我们测试的结果。

  • 我在Angular 12中运行ng测试时遇到以下问题: NullInjectorError:R3Injector错误(DynamicTestModule)[BaseURL- 错误:未定义应为true。位于UserContext。(http://localhost:9876/karma_webpack/webpack:/src/app/menu/menu.component.spec.ts:46:2

  • 在启动 Websphere liberty 服务器时注意到以下异常。如何删除它?感谢任何帮助。我们同时安装了javaee7配置文件和webProfile-6.0功能。EAR 应用程序有一个使用 jee6.0 / “3.0” web的 WAR 文件.xml

  • 像组件一样,服务通常需要依赖,Angular通过服务类的构造函数注入。由于我们在Angular的引导过程之外初始化这些类,我们必须自己显式注入这些依赖。这是通过使用TestBed配置测试模块传回所需的依赖项(如HTTP模块)来实现的。

  • 我是Java Web服务的新手,在过去的4天里我一直在坚持这一点。问题是,我打算创建供其他应用程序使用的web服务。要求web服务必须从一个表返回多条记录,因此我创建了一个示例web服务,下面是代码 界面 具有两个字符串对象的自定义类 这里是实现 使用JBossDeveloperStudio生成的WSDL是 当给出SOAP请求时,我得到强制转换异常[Lcom.org.ccb.test.Sample