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.