首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在JUnit/Mockito测试中注入bean将返回零

在JUnit和Mockito测试中,如果你发现注入的bean返回了零(null),这通常意味着bean没有被正确地注入或者mock。以下是一些基础概念和解决这个问题的步骤:

基础概念

  1. 依赖注入(Dependency Injection, DI):这是一种设计模式,用于实现控制反转(IoC),允许对象接收它们的依赖项,而不是自己创建它们。
  2. JUnit:这是一个流行的Java测试框架,用于编写和运行单元测试。
  3. Mockito:这是一个Java模拟框架,用于创建和管理测试中的模拟对象。

可能的原因和解决方案

原因1: Bean未被Spring容器管理

如果你的bean没有被Spring容器管理,那么它就不会被注入。

解决方案: 确保你的bean被标记为Spring组件(使用@Component, @Service, @Repository, 或 @Controller注解)。

代码语言:txt
复制
@Service
public class MyService {
    // ...
}

原因2: 测试类未被Spring管理

如果你的测试类没有被Spring管理,那么它就不会注入bean。

解决方案: 使用@RunWith(SpringRunner.class)(对于JUnit 4)或@ExtendWith(SpringExtension.class)(对于JUnit 5)注解来让Spring管理你的测试类。

代码语言:txt
复制
@RunWith(SpringRunner.class)
@SpringBootTest
public class MyServiceTest {
    @Autowired
    private MyService myService;

    // ...
}

原因3: Mockito mock未正确设置

如果你在测试中使用了Mockito mock,但未正确设置返回值,那么mock将返回默认值(对于对象类型是null)。

解决方案: 使用Mockito.when(...).thenReturn(...)来设置mock的返回值。

代码语言:txt
复制
@RunWith(MockitoJUnitRunner.class)
public class MyServiceTest {
    @Mock
    private AnotherDependency anotherDependency;

    @InjectMocks
    private MyService myService;

    @Test
    public void testMethod() {
        Mockito.when(anotherDependency.someMethod()).thenReturn("expectedValue");
        // ...
    }
}

原因4: 构造函数注入问题

如果你使用构造函数注入,确保所有必需的依赖项都在测试中提供。

解决方案: 在测试中创建bean实例时,确保传递所有必需的依赖项。

代码语言:txt
复制
public class MyService {
    private final AnotherDependency anotherDependency;

    public MyService(AnotherDependency anotherDependency) {
        this.anotherDependency = anotherDependency;
    }

    // ...
}

@Test
public void testConstructorInjection() {
    AnotherDependency mockDependency = Mockito.mock(AnotherDependency.class);
    MyService myService = new MyService(mockDependency);
    // ...
}

应用场景

这些概念和解决方案适用于任何使用Spring框架进行依赖注入,并且使用JUnit和Mockito进行单元测试的场景。

总结

确保你的bean被Spring正确管理,你的测试类也被Spring管理,并且如果你使用mock,确保它们被正确设置。通过这些步骤,你应该能够解决bean注入返回null的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 即使不懂单元测试,会用这个工具也够了~

    Mock 模拟 mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。 Mockito好处 无手写 : 无需自己编写模拟对象。...它用于保持测试干净并改善调试。它还会检测测试中可用的未使用的存根, 并使用@Mock注释对模拟进行初始化。 @InjectMocks 它标记应在其上执行注入的字段或参数。...它与Mockito的verify()方法一起使用, 以获取调用方法时传递的值。 @Spy 允许创建部分模拟的对象。换句话说, 它允许将现场实例快速包装在测试对象中。...; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito...@Mock 是一个实例里面的一个注入对象,对应的是spring的一个bean。

    1.7K10

    Springboot+Junit5微服务单元测试编写实践

    单元测试命名 可参考【翻译】7种流行的单元测试命名约定 在项目种我选择的是should...when的写法,但需注意方法命名时不要过长,过长反而导致难于阅读和理解 2....,尝试将其它有@Mock或@Spy的对象注入到该实例中;@Spy默认会调用真实的方法,@Mock默认不执行 @MockBean、@SpyBean Spring Boot包装Mockito库提供的注解;...测试方法结构 单元测试采用Given...When...Then的结构,即 准备数据,用mock模拟方法返回值 执行,调用测试方法 验证,用assert等验证方法返回结果 数据库的单元测试 @MybatisPlusTest...只注入MybatisPlus相关Bean做单元测试,比较像@Mybatis注解,由mybatis-plus的3.4.0版本后的mybatis-plus-boot-starter-test模块提供。...可以在做数据库的单元测试时不使用@SpringBootTest注解启动整个工程 接入层的单元测试 @WebMvcTest 同样用来做MVC层的单元测试,只注入MVC层相关的Bean

    1.6K00

    重学SpringBoot系列之Mockito测试

    ---- junit测试框架 在开始书写测试代码之前,我们先回顾一下JUnit常用的测试注解。在junit4和junit5中,注解的写法有些许变化。...---- Mockito测试框架 Mockito是GitHub上使用最广泛的Mock框架,并与JUnit结合使用.Mockito框架可以创建和配置mock对象.使用Mockito简化了具有外部依赖的类的测试开发...测试中,单个事务中的准备数据,无法在多线程中共享。...在单元测试中,模拟对象可以模拟复杂的、真实的对象的行为, 如果真实的对象无法放入单元测试中,使用模拟对象就很有帮助。...---- 轻量级测试 在ExtendWith的AutoConfigureMockMvc注解的共同作用下,启动了SpringMVC的运行容器,并且把项目中所有的@Bean全部都注入进来。

    2.5K20

    JAVA实战:如何让单元测试覆盖率达到80%甚至以上

    @Mock所谓的mock就是创建一个类的虚假的对象,在测试环境中,用来替换掉真实的对象,以达到两大目的:验证这个对象的某些方法的调用情况,调用了多少次,参数是什么等等指定这个对象的某些方法的行为,返回特定的值...同时还需要注意,@Mock注解只是用于创建一个模拟对象,在使用这个对象进行测试时,需要手动设定其返回值或行为。@InjectMocks是Mockito框架中的注解。...在测试类实例化时,Mockito会自动查找这个被mock对象的实例,然后把它注入到@InjectMocks注解标识的变量中。 需要注意的是,@InjectMocks注解仅仅用于自动注入成员变量。...例如,可以使用Mockito.when()方法来模拟一个方法的返回值.需要注意的是,Mockito.when()方法并不会真正地执行方法,而是返回了一个指定的返回值或设定的行为,用于在测试中进行验证。...Mockito.any()它可以用于匹配任意类型的参数。在测试代码中,当需要匹配方法的参数但不关心具体的参数值时,可以使用Mockito.any()方法来匹配参数。

    3.8K31

    mockito入门

    前言 最近在项目中跑单元测试发现直接使用springboot自带的测试,一整套跑起来花费数十分钟,这是无法忍受的,考虑到功能的特殊性,想到了Spring测试包自带的mockito单元测试,所以进行初次尝试使用...会报依赖注入异常 默认情况需要手动配置相关需要注入bean的类否则会报错,依赖注入异常,找不到相应的bean Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException...总结 默认情况下需要手动配置相对应的所有需要注入的bean,凡是你这个模块需要倒入的bean你都需要配置,如果你不配置注入就会报错,要么注入,要么mock,比如OrderB里面依赖了OrderA和一个静态的...OrderD类,OrderA bean要么mock要么注入,OrderD就不一样了因为是静态的,但是导入的时候需要注入OrderC所以站在Spring的角度,都需要注入。...站在项目的角度,项目越大不可能为了某个功能跑一次服务,因为服务还有其他功能,所以功能测试就成了很好的解决方案,你可以随意的mock,返回想要的值,最大角度的覆盖所有测试,唯一的缺点是,你需要考虑所有的依赖注入

    39540

    Mockito入门:如何在Spring中Mock部分对象

    在自测完成之后,我忘记了将源代码中的注释内容恢复,直接将Mock实现提交到了代码仓库中。...但是,Spring同样作为IOC框架,和Mockito的融合存在一定的问题。即如果需要对Spring Bean中的部分依赖进行Stub时,需要手动的去设置。...Mockito其实提供了一个非常方便的注解叫做@InjectMocks,该注解会自动把该单元测试中声明的Mock对象注入到该Bean中。...但是,如果不使用Spring的自动注入,则必须手动的将该类依赖的别的Bean注入进去。 因此目前使用Mockito的妥协方案是直接@Autowire该接口的实现。...然后在上面标记InjectMocks注解,此时会将测试中声明的Mock对象自动注入,而没有声明的依赖的对象依然采用Spring Bean的依赖注入: @RunWith(MockitoJUnitRunner.class

    11.1K20

    告别加班解放双手提高单测覆盖率之Java 自动生成单测代码神器推荐

    缺点:不使用 Confirm Mock功能时,对Spring 的 Bean 生成单测代码时,如果属性是通过 @Setter 注解注入,则不会生成 @Mock 属性 ;如果想实现暂时只能自己修改模板来支持...官方演示2:选择需要 mock 的属性 官方示例3:在单测里写 test 即可选择需要测试的方法自动生成测试代码 2.2.2 定制化 前面讲到默认的模板,对Spring 的 Bean 生成单测代码时...,如果通过 xml 方式声明 bean ,属性都是通过 @Setter 注解注入,则不会生成 @Mock 属性 。...优点:Spring 的 Bean 生成单测代码时,即使 @Component 这类注解标注,属性通过 Setter 注解注入时,也会自动给添加 @Mock 和 @InjectMock 这类属性。...asList(new UserDO()), result); } } 三、单测高效构造参数和返回值神器 我们还可以借助其他工具,自动生成测试的参数或者返回值。

    6.4K20

    Spring Boot 做单元测试,真心强悍!

    JUnit 5:Java 最主流的单元测试框架。 AssertJ:一款快速断言库。 Hamcrest:一款单元测试匹配库。 Mockito:一款 Mock 测试框架。...真实环境测试 在 @SpringBootTest 注解中指定基于随机端口的真实Web环境,然后在类成员变量或者方法参数上注入 TestRestTemplate 实例,就可以完成对 Spring MVC接口的真实环境测试...Mock 环境测试 通过在类上面使用 @AutoConfifigureMockMvc 注解,然后在类成员变量或者方法参数上注入MockMvc 实例,就可以完成对 Spring MVC 接口的 Mock...Spring Boot 提供了一个 @MockBean 注解,可为 Spring 中的 Bean 组件定义基于 Mockito 的Mock 测试,它可以创建一个新 Bean 以覆盖 Spring 环境中已有的...Mock 覆盖的,如果要模拟的 Bean 有多个,则可以使用@Qualififier注解指定,然后通过Mockito 提供的代理工具类方法创建模拟返回数据,运行该服务的测试方法,当模拟数据和预期结果一致时才会测试通过

    73830

    单元测试

    JUnit   测试驱动开发,所谓测试驱动开发,就是先写接口- >在写测试->写实现->运行测试。当然这是一种理想情况,大多数我们在开发中还是先写实现,后写测试代码。...("name1",event.getName()); } 当调用event.getName() 时返回 “name1” Mockito 常用 API : verify() 校验方法是否被调用 doThrow...配置Spring容器的配置 上面栗子 是为了测试 eventService.findEventById 方法,发现eventService和依赖EventMapper都是由Spring 容器注入,使用...将依赖的EventMapper依赖Mock,因为我们主要测试的是eventService.findEventById的逻辑。...而且不要使用公共配置,保持每个单元测试之间相互独立,在测试时依赖的Bean越多说明逻辑越复杂,就需要将代码重构。 Spring-boot-test maven依赖 <!

    1.7K30

    使用Spring Boot进行单元测试

    我们将带你学习如何以可测试的方式创建Spring Bean实例,然后讨论如何使用Mockito和AssertJ,这两个包在Spring Boot中都为了测试默认引用了。 本文只讨论单元测试。...进行集成测试 如果你喜欢看视频教程,可以看看Philip的课程:测试Spring Boot应用程序课程 依赖项 本文中,为了进行单元测试,我们会使用JUnit Jupiter(Junit 5),Mockito...在这个单元测试中,我们现在可以创建这样一个实例(或者我们之后要讨论的Mock实例)并通过构造函数注入了。...我相信,将这些时间投入到创建可读性强的测试代码中是值得的,即使之后它的可读性只有一点点提高。...如果你还是觉得很费事,可以看看断言生成器 结论 尽管在测试中启动Spring应用程序也有些理由,但是对于一般的单元测试,它不必要。有时甚至有害,因为更长的周转时间。

    2.4K30

    SpringBoot基础(五):集成JUnit5

    它支持在不同的环境中运行测试,如命令行、IDE或构建工具(例如Maven、Gradle) JUnit Jupiter:这个模块包含了JUnit5的新测试编写和扩展模型,提供了全新的注解、测试方法和扩展机制...这个模块允许开发者继续运行以前版本的测试,同时过渡到JUnit5 2、什么是单元测试 单元测试是指对软件中的最小可测试单元进行检查和验证的过程叫单元测试 在SpringBoot中,最小可测试单元就是指方法...Spring 应用上下文是否成功加载 } } 2、测试类和测试方法不需要声明为public 在JUnit4中,测试类和测试方法必须是public的,因为JUnit4通过反射机制要求访问公共方法...五、@MockBean注入 1、@MockBean的主要作用 @MockBean会将应用上下文中的某个Bean替换为模拟的Bean(Mock 对象) @MockBean自动与Spring上下文集成,允许模拟的...Bean被注入到需要它的其他Bean中 2、@MockBean的典型用法(模拟数据层) 假设我们有一个UserService依赖于UserRepository,而我们在测试中不想使用真实的UserRepository

    10710

    一文搞懂Spring5 Mock测试

    如果你已经把你的测试类升级到Junit5,那么你可以按下面这种方式在依赖中排除对Junit4的支持。...@MockBean与@SpyBean注解 @MockBean注解一般作用在测试类中注入的bean属性上,它表示一个模拟的bean,其在官方文档上的用法如下: import org.junit.jupiter.api.Test...MockMvc测试控制器的,在测试类上加上这个注解之后就可以在测试方法中通过@Autowired注解注入MockMvc实力bean了,官网上的demo用法如下: import org.junit.jupiter.api.Test...Spring5 Junit测试注解以及Mockito和BDDMockito两个Mock类中的常用方法 写在最后 限于文章篇幅,本文就只讲解了Spring官网中关于Spring5 中Mock测试完成Junit...相信看完本文的讲解后,对于在SpringBoot项目中使用Mock测试完成Junit5单元测试已经毫无压力了。

    2.8K20

    SpringBoot 单元测试利器-Mockito

    Mockito 是一种 Java mock 框架,他主要是用来做 mock 测试的,他可以模拟任何 Spring 管理的 bean、模拟方法的返回值、模拟抛出异常...等,在了解 Mockito 的具体用法之前...mock 测试就是在测试过程中,创建一个假的对象,避免你为了测试一个方法,却要自行构建整个 bean 的依赖链 像是以下这张图,类 A 需要调用类 B 和类 C,而类 B 和类 C 又需要调用其他类如...可以在单元测试中模拟一个 service 返回的数据,而不会真正去调用该 service,这就是上面提到的 mock 测试精神,也就是通过模拟一个假的 service 对象,来快速的测试当前我想要测试的类...在 SpringBoot 单元测试中使用 Mockito 首先在 pom.xml 下新增 spring-boot-starter-test 依赖,该依赖内就有包含了 JUnit、Mockito 中已存在的那个真实的 userDao bean,也就是说,注入进 userService 的 userDao bean,已经被我们替换成假的 mock 对象了,所以当我们再次调用

    3.9K20

    Spring Boot的单元测试(概念)

    Mockito:Java mocking框架,用于模拟任何Spring管理的Bean,例如在单元测试中模拟一个第三方系统Service接口返回的数据,而不去真正调用第三方系统。...JsonPath:提供类似于Xpath(一门在XML文档中查找信息的语言)那样的符号来获取JSOn数据片段。...二、Spring Boot单元测试程序模板 @RunWith注解是JUnit标准的一个注解,目的是告诉JUnit框架不要使用内置的方法进行单元测试,而应使用@RunWith指明的类来进行单元测试,...问题是单元测试不能实际调用CreditService(因为CreditService是第三方系统),因此,我们在单元测试类需要使用Mockito的注解@MockBean自动注入Spring管理的Service...去寻找一个主配置类(一个带@SpringBootApplication的类),并使用它来启动Spring应用程序上下文,注入所有Bean。

    1.6K30

    利用Mockito模拟DB

    这里我们将学习如何利用Mockito框架和一些注解模拟(mock)Repository实例,从而使得测试用例不依赖外部的数据库服务。...我们需要创建一个Spring Boot配置类,在该类中定义用于测试的Spring Bean;我们通过注解指示Spring Boot何时加载测试配置类以及何时执行该类中的代码。...在改配置类中,我们将使用Mockito框架创建一些带预定义方法的mock对象,Spring Boot在执行测试用例之前会将这些对象织入。...(在实际项目中我们会严格限制每个测试类中的内容)。...方法被@Before注解修饰,表示在测试用例运行之前被调用,在这个方法中我们配置了mock对象的行为:如果收到repository.count()调用,则返回1。

    2.1K20
    领券