2016-02-05 3 views
0

Я не могу показаться, что высмеивал недействительные методы на Mockito. Это дает незавершенное обрушение, обнаруженное здесь ошибка. Вот мой класс.Издевательские методы пустоты с использованием Mockito

package com.twu.biblioteca; 

import java.io.InputStream; 
import java.io.PrintStream; 
import java.util.InputMismatchException; 
import java.util.Scanner; 

public class BibliotecaApp { 

public static class IntegerAsker { 
    private final Scanner scanner; 
    private final PrintStream out; 

    public IntegerAsker(InputStream in, PrintStream out) { 
     scanner = new Scanner(in); 
     this.out = out; 
    } 

    public int ask(String message) { 
     out.print(message); 
     return scanner.nextInt(); 
    } 
} 

public static int numberOfBooks = 0; 

public static class book{ 
    int serialNo; 
    String name; 
    String author; 
    int publication; 
    int checkoutstatus; 

    book(){ 
     serialNo = -1; 
     name = null; 
     author = null; 
     publication = -1; 
     checkoutstatus = -1; 
    } 

    book(int serialNo,String name, String author, int publication){ 
     this.serialNo = serialNo; 
     this.name = name; 
     this.author = author; 
     this.publication = publication; 
     this.checkoutstatus=checkoutstatus = 1; 
    } 
} 

public static int getBoundIntegerFromUser(IntegerAsker asker,String message,int lowerBound,int upperBound) { 
    int input; 
    try 
    { 
     input = asker.ask(message); 
     while(input>upperBound || input<lowerBound) 
      input = asker.ask("Select a valid option! "); 
      return input; 

    } 
    catch(InputMismatchException exception) 
    { 
     System.out.print("You have selected an invalid option! "); 
    } 
    return -1; 
} 

public static book[] booksList = new book[20]; 


public static String welcome(){ 
    IntegerAsker asker = new IntegerAsker(System.in,System.out); 
    return "**** Welcome Customer! We are glad to have you at Biblioteca! ****"; 

} 

public static void addBooks(){ 
    book newBook1 = new book(1,"Head First Java","Bert Bates",2014); 
    booksList[1] = newBook1; 
    numberOfBooks += 1; 

    book newBook2 = new book(2,"1000 IT Quizzes","Dheeraj Malhotra",2009); 
    booksList[2] = newBook2; 
    numberOfBooks += 1; 

    book newBook3 = new book(3,"100 Shell Programs in Unix","Shivani Jain",2009); 
    booksList[3] = newBook3; 
    numberOfBooks += 1; 

} 

public static void mainMenu(IntegerAsker asker){ 

    System.out.println("1 " + "List Books"); 
    System.out.println("2" + " Checkout a Book"); 
    System.out.println("3 " + "Quit"); 
    int n = getBoundIntegerFromUser(asker,"Enter your choice. ",1,3); 
    mainMenuaction(n,asker); 
} 

public static void mainMenuaction(int n,IntegerAsker asker){ 
    if(n==1){ 
     showBooks(); 
     mainMenu(asker); 
    } 
    else if(n==2){ 
     checkout(asker); 
    } 
    else if(n==3){ 
     return; 
    } 
} 

public static void showBooks(){ 
    for(int i=1;i<=numberOfBooks;i++){ 
     if(booksList[i].checkoutstatus!=0) 
     System.out.println(booksList[i].serialNo + ".\t" + booksList[i].name + "\t" + booksList[i].author + "\t" + booksList[i].publication); 
    } 
} 

public static void checkout(IntegerAsker asker){ 
    int Input = asker.ask("Enter the serial numebr of the book that you want to checkout"); 
    if(booksList[Input]!=null){ 
     if(booksList[Input].checkoutstatus!=0){ 
      booksList[Input].checkoutstatus=0; 
      System.out.println("Thank you! Enjoy the book"); 
     } 
     else{ 
      System.out.println("That book is not available."); 
     } 
    } 
    else{ 
     System.out.println("That book is not available."); 
    } 

    mainMenu(asker); 

} 


public static void main(String[] args) { 
    System.out.println(welcome()); 
    addBooks(); 
    IntegerAsker asker = new IntegerAsker(System.in,System.out); 
    mainMenu(asker); 
} 
} 

И вот идет мой тестовый файл -

package com.twu.biblioteca; 


import org.mockito.Mockito; 
import org.mockito.Mockito.*; 
import org.junit.Test; 
import static org.junit.Assert.assertEquals; 
import static org.mockito.Mockito.*; 


public class ExampleTest { 

BibliotecaApp test = Mockito.mock(BibliotecaApp.class); 

@Test 
public void welcometest() { 
    assertEquals("**** Welcome Customer! We are glad to have you at Biblioteca! ****",test.welcome()); 
} 

@Test 
public void addBooksTest(){ 
    test.addBooks(); 

    assertEquals("Head First Java",test.booksList[1].name); 
    assertEquals("Dheeraj Malhotra",test.booksList[2].author); 
    assertEquals(2009,test.booksList[3].publication); 
} 

@Test 
public void getBoundIntegerFromUserTest(){ 
    BibliotecaApp.IntegerAsker asker = mock(BibliotecaApp.IntegerAsker.class); 
    when(asker.ask("Enter your choice. ")).thenReturn(99); 
    when(asker.ask("Select a valid option! ")).thenReturn(1); 

    BibliotecaApp.getBoundIntegerFromUser(asker,"Enter your choice. ",1,2); 

    verify(asker).ask("Select a valid option! "); 
} 

@Test 
public void mainMenuTest(){ 
    BibliotecaApp.IntegerAsker asker = mock(BibliotecaApp.IntegerAsker.class); 

    when(asker.ask("Enter your choice. ")).thenReturn(3); 
    test.mainMenu(asker); 

    verify(test).mainMenuaction(1,asker); 
} 

@Test 
public void checkoutTest(){ 
    BibliotecaApp.IntegerAsker asker = mock(BibliotecaApp.IntegerAsker.class); 
    BibliotecaApp test = new BibliotecaApp(); 
    BibliotecaApp mock = spy(test); 
    when(asker.ask("Enter the serial numebr of the book that you want to checkout")).thenReturn(2); 
    Mockito.doNothing().when(mock).mainMenu(asker); 

    test.addBooks(); 
    test.checkout(asker); 


    assertEquals(0,test.booksList[2].checkoutstatus); 
} 
} 

Может кто-то указать на то, что я делаю неправильно, пожалуйста?

+0

Mockito.doNothing() есть линия, где я даюсь Ошибка! Простите за неудобство! – Ritabrata

+1

Возможный дубликат [Как сделать mock для void методов с mockito] (http://stackoverflow.com/questions/2276271/how-to-make-mock-to-void-methods-with-mockito) –

+1

Просьба рассмотреть возможность обновления вопрос о том, чтобы испытуемый класс и тестовый класс были как можно меньше (один статический метод, один тестовый пример). Это значительно упростит ответ. – avandeursen

ответ

2
/* system */ public static void mainMenu(IntegerAsker asker){ ... } 
/* test */ Mockito.doNothing().when(mock).mainMenu(asker); 

Ваша проблема не в том, насмехаясь void методы, речь идет о насмешливый static методы, которые Mockito не могут сделать. За кулисами Mockito создает переопределение вашего класса mocked/spied (BibliotecaApp), чтобы переопределить каждый из методов, но поскольку методы static нельзя переопределить одинаково, Mockito не может изменить поведение mainMenu - даже просто чтобы обнаружить, что вы назвали его в процессе обучения, поэтому это проявляется как «незавершенное окунирование».

Удалить модификатор static от mainMenu, и вы преодолеете это препятствие.


Сторона примечания: вы также смотрите на класс, но сохраните оригинал. Это не очень хорошая идея в Mockito: шпион на самом деле создает копию объекта, поэтому, если вы полагаетесь на поведение, которое применяется к шпиону, вам нужно будет вызвать методы проверки на шпиона. (Это одна из причин, чтобы избежать шпионов в тестах:. С помощью шпионов могут размыть грань между тестированием поведения вашей системы и тестированием поведения Mockito в)

BibliotecaApp test = new BibliotecaApp(); 
BibliotecaApp mock = spy(test); 
when(asker.ask("...")).thenReturn(2); 
Mockito.doNothing().when(mock).mainMenu(asker); 

test.addBooks();   // should be: mock.addBooks() 
test.checkout(asker);  // should be: mock.checkout(asker) 
Смежные вопросы