美文网首页软件自动化测试
Java_UT_Mock系列之-05Powermock与临时变量

Java_UT_Mock系列之-05Powermock与临时变量

作者: antony已经被占用 | 来源:发表于2018-06-25 21:36 被阅读4次

测试场景

在测试过程中,发现我们的开发同学喜欢在方法中临时new 出一些类来完成某项工作。由于局部变量用完立即销毁了,使用起来也就非常灵活和随意了。
但这样就对单元测试造成了不小的麻烦。 如以下的案例

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class ReaderDemo {
public static String read(String path) throws IOException {
String result = "";
InputStream in = new FileInputStream(path);
InputStreamReader isr = new InputStreamReader(in);
BufferedReader br = new BufferedReader(isr);
for (String line = br.readLine(); line != null; line = br.readLine()) {
result+=line;
}
isr.close();
return result;
}
}

FileInputStream、InputStreamReader、BufferedReader都是在read方法的执行过程中临时new出来的,无法通过ReaderDemo的构造方法或者修改成员变量等方式进行注入。

解决方法

幸好Powermock提供了whenNew这样一个Mock方法,可以解决上述临时变量的问题。 demo案例的测试用例如下

import static org.junit.Assert.assertEquals;
import static org.powermock.api.mockito.PowerMockito.doReturn;
import static org.powermock.api.mockito.PowerMockito.mock;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
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;
@RunWith(PowerMockRunner.class)
@PrepareForTest({ ReaderDemo.class })
public class ReaderDemoTest {
    @Test
    public void doSomethingReturnsValueFromBufferedReader() throws Exception {
        InputStreamReader inputStreamReaderMock = mock(InputStreamReader.class);
        BufferedReader bufferedReaderMock = mock(BufferedReader.class);
        FileInputStream inputStreamMock= mock(FileInputStream.class);
        PowerMockito.whenNew(BufferedReader.class).
                    withArguments(inputStreamReaderMock).
                    thenReturn(bufferedReaderMock);
        PowerMockito.whenNew(FileInputStream.class).
        withAnyArguments().
        thenReturn(inputStreamMock);

      PowerMockito.whenNew(InputStreamReader.class).
                    withAnyArguments().thenReturn(inputStreamReaderMock);
        final String string = "key=value\n";
      doReturn(string).doReturn(null).when(bufferedReaderMock).readLine(); 
        // read && Assert
        assertEquals(string, ReaderDemo.read("anything"));
    }
}

第二次调用readLine()时返回null,不然就死循环了。

相关文章

  • Java_UT_Mock系列之-05Powermock与临时变量

    测试场景 在测试过程中,发现我们的开发同学喜欢在方法中临时new 出一些类来完成某项工作。由于局部变量用完立即销毁...

  • Java_UT_Mock系列之-03Powermock与临时变量

    测试场景 在测试过程中,发现我们的开发同学喜欢在方法中临时new 出一些类来完成某项工作。由于局部变量用完立即销毁...

  • Java_UT_Mock系列之-01 Powermock与The

    测试场景及问题 笔者在对某个JAVA socket通信程序进行UT的时候,遇到过以下一个场景, 客户端发出登陆请求...

  • Java_UT_Mock系列之-01 Powermock与The

    测试场景及问题 笔者在对某个JAVA socket通信程序进行UT的时候,遇到过以下一个场景,客户端发出登陆请求,...

  • Java_UT_Mock系列之-06Powermock与Logg

    日志几乎是所有应用所必备的模块。 在单元测试中,有时候也需要与日志类打交道。笔者用以下案例来介绍如何mock日志类...

  • Java_UT_Mock系列之-06Powermock与Logg

    简介 日志几乎是所有应用所必备的模块。 在单元测试中,有时候也需要与日志类打交道。笔者用以下案例来介绍如何mock...

  • 面试简述

    关于iOS面试常见问题总结: 1.算法:Leetcode,剑指offer系列 交换两个变量的值(如果不使用临时变量...

  • Java_UT_Mock系列之-07 private stati

    测试场景 测试中有遇到一个测试超时的场景。 在系统中配置了一个timeout,默认譬如300S,程序在未达到tim...

  • Java_UT_Mock系列之Spring+Powermock

    在SpringMVC/SpringBoot 的项目中,虽然Service层的测试通过Mockito可以涵盖绝大部分...

  • 关于临时变量

    剑指Offer23题: 对于以下这两句代码: 第一种写法,在堆中新建了一个新的ArrayList,原来的list中...

网友评论

    本文标题:Java_UT_Mock系列之-05Powermock与临时变量

    本文链接:https://www.haomeiwen.com/subject/gpsuyftx.html