Как создать заглушки для файлов ввода-вывода для модульного тестирования в Java?

1

Для назначения тестового курса мне нужно создать модульные тесты для моей уже закодированной системы с помощью JUnit. Моя система сильно зависит друг от друга, и она также записывает/читает из нескольких текстовых файлов на моем диске. Я понимаю, что я должен устранить все зависимости для успешного модульного теста, я просто не знаю, как создавать заглушки для файлов.

Любая помощь в коде, инструментах или концепциях приветствуется

 import Objs.*;
import java.io.*;
import java.net.URL;
import java.util.Scanner;

/**
 *This class communicates with the users file by writing to it, reading from it, searching, deleting...
 * 
 */
public class users {
     public static File usersFile = new File("usersFile.txt");
  public static PrintWriter writer;
  static Scanner read ;

public static void write(userObj u){

    try {
                String gather = read();
                String newUser = u.toString();
                writer = new PrintWriter(usersFile);
                writer.append(gather).append(newUser).append("\n");
                writer.close();
                System.out.println("The users' file has been updated");

    }
    catch(FileNotFoundException ex){
        System.out.print("file not found");

    }
}

public static String read(){ 
      String f = null;
    try {
                read = new Scanner(usersFile);
                StringBuilder gather = new StringBuilder();
                while(read.hasNext()){

                    gather.append(read.nextLine()).append("\n");
                    }
                f = gather.toString();
    }
    catch(FileNotFoundException ex){
        System.out.print("file not found");

    }
    return f;
}

public static userObj search(String s){

    userObj foundUser = null;
    try {
                read = new Scanner(usersFile);
                String st=null;
                while(read.hasNext()){
                   if (read.next().equalsIgnoreCase(s)){
                      foundUser = new userObj(); 
                    foundUser.name = s;
                    foundUser.setType(read.next().charAt(0));
                    foundUser.credit  = read.nextDouble();
                   }
                       }
    }
    catch(FileNotFoundException ex){
        System.out.print("file not found");

    }
    return foundUser;
}

public static void remove(userObj u){

    String s = u.name;
    if (search(s) == null){
        return;}

    try {
                read = new Scanner(usersFile);
                StringBuilder gather = new StringBuilder();
                while(read.hasNext()){
                    String info = read.nextLine();
                   if (info.startsWith(s)){
                      continue;
                   }
                   gather.append(info).append("\n");
                       }

                writer = new PrintWriter(usersFile);
                writer.append(gather).append("\n");
                writer.close();
                System.out.println("The user has been deleted");



    }

    catch(FileNotFoundException ex){
        System.out.print("file not found");

    }}

public static void update(userObj u){
    remove(u);
    write(u);
}
}
Теги:
unit-testing
junit

1 ответ

2
Лучший ответ

Вам не нужно создавать "заглушки для файлов", вам нужно создать "заглушку для чтения из InputStream".

Для read, search и remove используется Scanner, который принимает InputStream как один из его перегруженных конструкторов. Если вы добавите параметр InputStream, вы можете использовать его для создания своего Scanner. При нормальном использовании вы можете передать FileInputStream, используя StringBufferInputStream для тестирования.

Для write и remove вы используете PrintWriter, который принимает OutputStream как один из его перегруженных конструкторов. Если вы добавите параметр OutputStream, вы можете использовать его для создания PrintWriter. При нормальном использовании вы можете передать FileOutputStream, используя ByteArrayOutputStream для тестирования. Если вы хотите прочитать результат в виде строки из своего теста, используйте toString(String charsetName).

public class Users {
    ...

    public static void write(UserObj u, InputStream input, OutputStream output) {
        ...
        String gather = read(input);
        ...
        writer = new PrintWriter(output);
        ...
    }

    public static String read(InputStream input) {
        ...
        read = new Scanner(input);
        ...
    }

    public static UserObj search(String s, InputStream input) {
       ...
       read = new Scanner(input);
       ...
    }

    public static void remove(UserObj u, InputStream input, OutputStream output) {
       ...
       read = new Scanner(input);
       ...
       writer = new PrintWriter(output);
       ...
    }

    public static void update(UserObj u, InputStream input, OutputStream output) {
        remove(u, input, output);
        write(u, input, output);
    }
}

// Client code example
FileInputStream input = new FileInputStream("usersFile.txt");
FileOutputStream output = new FileOutputStream("usersFile.txt");
...
Users.write(myUser, input, output);
...
String result = Users.read(input);
...
myUser = Users.search(myString, input);
...
Users.remove(myUser, input, output);
...
Users.update(myUser, input, output);

// Testing code example
StringBufferInputStream input = new StringBufferInputStream("...");
ByteArrayOutputStream output = new ByteArrayOutputStream();
...
Users.write(myUser, input, output);
...
String result = Users.read(input);
...
myUser = Users.search(myString, input);
...
Users.remove(myUser, input, output);
...
Users.update(myUser, input, output);
...
result = output.toString("UTF-8"); // see docs for other legal charset names
  • 0
    Хороший задержанный ответ!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню