您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何使用Mockito或Powermock模拟局部变量

如何使用Mockito或Powermock模拟局部变量

要使此工作正常进行,您需要使用powermockito拦截构造函数调用(新的InputStreamReader(…),新的BufferedReader(…)),以便返回模拟。下面是一个示例。在您的情况下,仅拦截新的BufferedReader调用就足够了。

假设以下是您要测试的代码

package test;

import java.io.*;

public class SUT {

    public String doSomething() throws IOException {
        InputStreamReader reader =
                new InputStreamReader(getFileAsStream(null, null));
        BufferedReader bReader =
                new BufferedReader(reader);

        return bReader.readLine();
    }

    private InputStream getFileAsStream(Object resourceResolver, Object iconPath)
            throws FileNotFoundException {
        return new ByteArrayInputStream("".getBytes());
    }
}

以下测试代码是如何拦截构造函数调用的示例:

package test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.powermockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import java.io.BufferedReader;
import java.io.InputStreamReader;

import static org.junit.Assert.assertEquals;
import static org.powermock.api.mockito.powermockito.doReturn;
import static org.powermock.api.mockito.powermockito.mock;

@RunWith(PowerMockRunner.class)
@PrepareForTest({ SUT.class })
public class SUTTest {

    @Test
    public void doSomethingReturnsValueFromBufferedReader() throws Exception {
        // Arrange
        SUT sut = new SUT();
        InputStreamReader inputStreamReaderMock = mock(InputStreamReader.class);
        BufferedReader bufferedReaderMock = mock(BufferedReader.class);

        // Set your mocks up to be returned when the new ...Reader calls 
        // are executed in sut.doSomething()
        powermockito.whenNew(InputStreamReader.class).
                     withAnyArguments().thenReturn(inputStreamReaderMock);
        powermockito.whenNew(BufferedReader.class).
                     withArguments(inputStreamReaderMock).
                     thenReturn(bufferedReaderMock);

        // Set the value you want bReader.readLine() to return 
        // when sut.doSomething() executes
        final String bufferedReaderReturnValue = "myValue";
        doReturn(bufferedReaderReturnValue).when(bufferedReaderMock).readLine();

        // Act
        String result = sut.doSomething();

        // Assert
        assertEquals(bufferedReaderReturnValue, result);
    }
}

希望这可以帮助您解决当前的问题。但是,在我看来,您正在创建的内容将是一个非常缓慢,令人困惑且脆弱的测试。现在,您正在嘲笑太多,以致于很难确定您实际要测试的内容

大量的模拟可能表明您正在测试的代码设计将需要做一些工作以提高可测试性。如果您无法触摸代码,那么您将无法这样做- 但是请尝试使您的测试更具可读性和直观性(“调用方法时,应该发生此事,因为…”)。

其他 2022/1/1 18:14:26 有890人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶