0

I am writing Service for adding new Menu Items to Menu. Everything works fine with the tutorial which guided how to stimulate the System.in in Junit test. However, one parameter of Menu Items need to set to float value is Menu Item price. As a result, the String input I provided by ByteArrayInputStream and System.setIn doesn't seem to change the String values to Float value as I expected.

This is my service code:

public class DailyMenuServicesImpl implements DailyMenuServices {
    private MenuPrinter menuPrinter;

    public DailyMenuServicesImpl(){
        this.menuPrinter = new MenuPrinterImpl();
    }
    @Override
    public DailyMenu addMenuItemsToMenu(DailyMenu dailyMenu) {
        Scanner scanner = new Scanner(System.in);
        MenuItem menuItem = new MenuItem();

        List<MenuItem> menuItemList = dailyMenu.getMenuItemList();
        try {
            System.out.print("\nInsert menu item name: ");
            menuItem.setNames(scanner.nextLine());
            System.out.print("Insert menu item description: ");
            menuItem.setDescription(scanner.nextLine());
            System.out.print("Insert menu item image: ");
            menuItem.setImage(scanner.nextLine());
            System.out.print("Insert menu item price:");
            menuItem.setPrice(scanner.nextFloat()); // this is the problem everything above works fine.
            menuItemList.add(menuItem);
            dailyMenu.setMenuItemList(menuItemList);
        }catch (IllegalStateException exception){
            System.out.println(exception.getMessage());
        }catch (InputMismatchException exception){
            System.out.println(new InputMismatchException("Menu item price must be number !!!").getMessage());
        }
        return dailyMenu;
    }
}

And here is my unit test:

@RunWith(MockitoJUnitRunner.class)
public class DailyMenuServiceTest {
    private MenuPrinter menuPrinter;

    private DailyMenuServices dailyMenuServices;
    private final InputStream systemIn = System.in;
    private final PrintStream systemOut = System.out;

    private ByteArrayInputStream testIn;
    private ByteArrayOutputStream testOut;

    @Before
    public void init(){
        dailyMenuServices = new DailyMenuServicesImpl();
        testOut = new ByteArrayOutputStream();
        menuPrinter = new MenuPrinterImpl();
        System.setOut(new PrintStream(testOut));
    }

    @After
    public void restoreSystemInputOutput(){
        System.setIn(systemIn);
        System.setOut(systemOut);
    }
    @Test
    public void whenAddNewMenuItemsToMenu_returnNewDailyMenu(){
        List<MenuItem> menuItemList = new ArrayList<>();
        DailyMenu dailyMenu = new DailyMenu(menuItemList);
        provideInput("Pizza\nGood\nItaly\n4.56f");
        dailyMenu = dailyMenuServices.addMenuItemsToMenu(dailyMenu);

        menuPrinter.printMenu(dailyMenu);
        String expected = "Names: Pizza -  Price: 4.56$";

        assertEquals(expected,testOut.toString());
    }

    private void provideInput(String data){
        testIn = new ByteArrayInputStream(data.getBytes());
        System.setIn(testIn);
    }

So how I can set the Menu Item price parameter as Float values if I use the ByteArrayInputStream like tutorial? All your supports are big helps to me.

1 Answers1

1

You can use the System Rules to pass in the user input from the Java.lang.System I believe.You can find more information here: https://stefanbirkner.github.io/system-rules

Keep in mind this is an external Library

Syntax Should be

import java.util.Scanner;

public class Summarize {
  public static int sumOfNumbersFromSystemIn() {
    Scanner scanner = new Scanner(System.in);
    int firstSummand = scanner.nextInt();
    int secondSummand = scanner.nextInt();
    return firstSummand + secondSummand;
  }
}
import static org.junit.Assert.*;
import static org.junit.contrib.java.lang.system.TextFromStandardInputStream.*;

import org.junit.Rule;
import org.junit.Test;
import org.junit.contrib.java.lang.system.TextFromStandardInputStream;

public class SummarizeTest {
  @Rule
  public final TextFromStandardInputStream systemInMock
    = emptyStandardInputStream();

  @Test
  public void summarizesTwoNumbers() {
    systemInMock.provideLines("1", "2");
    assertEquals(3, Summarize.sumOfNumbersFromSystemIn());
  }
}