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

当(..).thenReturn() NullPointerException时模拟Junit

当在使用 JUnit 进行单元测试时,如果在调用 when(...).thenReturn(...) 方法时遇到 NullPointerException,通常是因为 Mockito 框架无法找到要模拟的对象或方法。以下是一些基础概念和相关解决方案:

基础概念

  1. Mockito: 一个用于 Java 的模拟框架,广泛用于单元测试中,以便隔离被测代码的依赖项。
  2. when(...).thenReturn(...): Mockito 提供的方法,用于指定当某个方法被调用时应返回的值。
  3. NullPointerException: 当应用程序试图在需要对象的地方使用 null 时抛出的异常。

可能的原因

  1. 未正确初始化模拟对象:在使用 when(...).thenReturn(...) 之前,必须先创建并注入模拟对象。
  2. 方法调用不正确:指定的方法名或参数类型可能与实际的方法不匹配。
  3. 静态方法或私有方法的模拟:Mockito 默认不支持静态方法或私有方法的模拟,需要使用 PowerMockito 等扩展。

解决方案

1. 确保正确初始化模拟对象

代码语言:txt
复制
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

public class ExampleTest {

    @Mock
    private Dependency dependency;

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

    @Test
    public void testMethod() {
        when(dependency.someMethod()).thenReturn("mockedValue");
        // 进行测试
    }
}

2. 检查方法调用是否正确

确保 when(...).thenReturn(...) 中的方法名和参数类型与实际的方法一致。

代码语言:txt
复制
when(dependency.someMethod(arg1, arg2)).thenReturn("expectedResult");

3. 使用 PowerMockito 处理静态方法或私有方法

如果需要模拟静态方法或私有方法,可以使用 PowerMockito。

代码语言:txt
复制
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.junit.jupiter.MockitoExtension;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@ExtendWith(MockitoExtension.class)
@PrepareForTest(StaticClass.class)
public class StaticMethodTest {

    @Test
    public void testStaticMethod() {
        PowerMockito.mockStatic(StaticClass.class);
        when(StaticClass.staticMethod()).thenReturn("mockedValue");
        // 进行测试
    }
}

应用场景

  • 单元测试: 在隔离环境中测试单个组件或方法。
  • 集成测试: 确保多个组件协同工作时功能正常。
  • Mock 对象: 替代真实依赖,以便在不影响其他系统组件的情况下进行测试。

通过上述方法,可以有效解决在使用 JUnit 和 Mockito 进行单元测试时遇到的 NullPointerException 问题。确保正确初始化和使用模拟对象是关键步骤。

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

相关·内容

  • Mockito 一个优秀的 Mock 测试框架

    那有没有什么办法我们可以跳过或者说模拟方法 B 的输出呢?这就引出了我们今天的主角 Mockito,一个优秀的 Mock 测试框架。...Mockito 是一个很好用的模拟框架。它让您可以使用干净简单的 API 编写漂亮的测试。Mockito 的可读性非常好,不会让你感动迷惑,产生的验证错误也很明确。...)).add("test2"); //最多 5 次 verify(mockedList, atMost(5)).add("test2"); 测试用例 2 通过设值或者打桩的方式预设参数,如下所示,当执行...get(0) 操作时,我们通过 thenReturn()方法返回 hello,当执行 get(1)操作时我们抛出空指针异常,运行结果如下图所示: @Test public void testWhen(...("hello"); when(mockedList.get(1)).thenThrow(new NullPointerException()); System.out.println(mockedList.get

    1.8K20

    Mockito模拟进行单元测试

    ); //预设当iterator调用next()时第一次返回hello,第n次都返回world when(iterator.next()).thenReturn("hello").thenReturn...(OutputStream.class); OutputStreamWriter writer = new OutputStreamWriter(outputStream); //预设当流关闭时抛出异常...,他用简单的when(mock.method(params)).thenRetrun(result)语句设置mock对象的行为,如下语句: // 设置mock对象的行为 - 当调用其get方法获取第0个元素时...,以及调用时候传递的参数(0),然后在调用thenReturn方法时再把“first”保存起来,这样,就有了构建一个stub方法所需的所有信息,构建一个stub。...当get方法被调用的时候,实际上调用的是之前保存的proxy对象的get方法,返回之前保存的数据。

    7K20

    Mockito模拟进行单元测试

    最后方法也根据我们设定好的数据进行了输出,并没有进行调用mysql的操作:这样的好处时在生产环境跑单元测试时也不会影响数据库的数据 ?...); //预设当iterator调用next()时第一次返回hello,第n次都返回world when(iterator.next()).thenReturn("hello").thenReturn...(OutputStream.class); OutputStreamWriter writer = new OutputStreamWriter(outputStream); //预设当流关闭时抛出异常...,他用简单的when(mock.method(params)).thenRetrun(result)语句设置mock对象的行为,如下语句: // 设置mock对象的行为 - 当调用其get方法获取第0个元素时...,以及调用时候传递的参数(0),然后在调用thenReturn方法时再把“first”保存起来,这样,就有了构建一个stub方法所需的所有信息,构建一个stub。

    9.5K20

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

    当我们使用@Mock注解标注一个对象时,这个对象的行为可以被模拟,以便对测试目标类进行测试。在对模拟对象进行测试时,我们可以设定模拟对象的返回值或行为,并用这些值来测试测试目标类的行为。...同时还需要注意,@Mock注解只是用于创建一个模拟对象,在使用这个对象进行测试时,需要手动设定其返回值或行为。@InjectMocks是Mockito框架中的注解。...具体来说,Mockito.when()方法接受两个参数,一个是模拟对象的方法调用,另一个是指定的行为或返回值。当模拟对象的方法被调用时,Mockito就会按照when()方法中指定的方式进行处理。...在测试代码中,当需要匹配方法的参数但不关心具体的参数值时,可以使用Mockito.any()方法来匹配参数。...具体来说,Mockito.any()方法可以用于模拟对象的方法调用或验证方法调用时的参数匹配。需要注意的是,当使用Mockito.any()方法时,需要确保模拟方法的返回值与模拟方法的参数类型兼容。

    3.8K31

    #Android单元测试学习总结「建议收藏」

    还有一个主要的问题就是本地单元测试由于是运行本地JVM环境,无法依赖Android的api,只靠纯Junit的测试环境很难模拟出完整的Android环境,导致无法测试Android相关的代码,而Mock...的情况 如当监控真实的对象并且调用真实的函数带来的影响时 List list = new LinkedList(); List spy = spy(list); //不可能完成的:真实方法被调用的时候list...有时,当需要额外的灵活性时你可能需要使用参数匹配器,也就是argument matchers : // 使用内置的anyInt()参数匹配器 when(mockedList.get(anyInt()))...因此,当使用监控对象时请考虑doReturn|Answer|Throw()函数族来进行打桩。...(file)方法模拟创建File的操作,当File类以aaa的参数创建的时候返回已经mock出来的file对象。

    5.1K20

    使用强大的 Mockito 来测试你的代码

    mock object 是指类或者接口的模拟实现,你可以自定义这个对象中某个方法的输出结果。 测试替代技术能够在测试中模拟测试类以外对象。因此你可以验证测试类是否响应正常。...一个典型的例子是把 Mock 对象模拟成数据的提供者。在正式的生产环境中它会被实现用来连接数据源。但是我们在测试的时候 Mock 对象将会模拟成数据提供者来确保我们的测试环境始终是相同的。...when(….).thenReturn(….)可以被用来定义当条件满足时函数的返回值,如果你需要定义多个返回值,可以多次定义。...Using mockito is great"); twitterClient.sendTweet(iTweet); } 现在 TwitterClient 可以使用 ITweet 接口的实现,当调用...8、模拟静态方法 8.1 使用power mock来模拟静态方法 因为 Mockito 不能够 mock 静态方法,因此我们可以使用 Powermock。

    11.2K60

    Difference between @Mock, @InjectMocks and @Captor

    启用Mockito注释 我们的第一个选择是使用MockitoJUnitRunner注释 JUnit 测试: @ExtendWith(MockitoExtension.class) public class...当需要为给定类执行实际方法体时,使用@InjectMocks。 我们必须为模拟对象定义when-thenReturn 方法,以及在实际测试执行期间将调用哪些类方法。...当我们需要使用模拟对象初始化所有内部依赖项才能正确运行该方法时,请使用@InjectMocks。 @Mock注解 Mockito 中使用最广泛的注释是@Mock。...mockedList).add(argCaptor.capture()); assertEquals("one", argCaptor.getValue()); } 请注意,当我们删除配置逻辑时,...使用SpringExtension配置单元测试 当不需要mock的时候,可以使用SpringExtension环境进行局部测试,这里有一个点就是,需要手动导入ContextConfiguration配置类

    21410
    领券