2014-09-23 3 views
0

У меня есть некоторые проблемы, издевающиеся над методом (используя mockito), которые в зависимости от входного параметра возвращают String или исключение.Mocking a Exception

Код модульного теста кажется неправильным, но даже после запроса google я не смог найти решение.

Спасибо за любую помощь

public class MyClassTest 
{ 
    public MyClass mc; 
    public ClassUnknown cu; 

    @Before 
    public void setUp() 
    { 
     mc = new MyClass(); 
     cu = mock(ClassUnknown.class); 
     // The next two lines seems to be wrong 
     when(cu.methodUnknown("hello")).thenReturn("hello there"); 
     when(cu.methodUnknown("???")).thenThrow(new Exception("don't know"));   
    } 

    @Test 
    public void testMain() 
    { 

     mc.mainMethod("hello"); 
     .....; 
    }  
} 

и вот "classUnknown":

public class ClassUnknown 
{ 
    public String methodUnknown(String s) throws Exception 
    { 
     // The real logic is much more complex and does some CRUD operations 
     if (s.equals("Hello")) 
     { 
      return "Hello there"; 
     } 
     throw new Exception("don't know"); 
    } 
} 

и класс для тестирования:

public class MyClass 
{ 

    public void mainMethod(String s) 
    { 
     ClassUnknown cu = new ClassUnknown(); 

     try 
     { 
      String methodUnknown = cu.methodUnknown(s); 
      System.out.println(methodUnknown); 
     } catch (Exception ex) 
     { 
      System.out.println(ex.getMessage()); 
     } 

    } 

} 

ответ

2

Вы создаете экземпляр от MyClass. Затем вы создаете фиктивный пример ClassUnknown. Затем вы вызываете mainMethod() по экземпляру MyClass. Этот метод создает еще один экземпляр ClassUnknown и использует его. Таким образом, фиктивный пример ClassUnknown никогда не используется ни в чем и не участвует в тестировании.

Что вам нужно сделать, это передать фиктивный экземпляр ClassUnknown к MyClass, например, что вы тестируете (или метод, который вы тестируете):

public class MyClass { 

    private ClassUnknown cu; 

    public MyClass(ClassUnknown cu) { 
     this.cu = cu; 
    } 

    public void mainMethod(String s) { 
     try { 
      String methodUnknown = cu.methodUnknown(s); 
      System.out.println(methodUnknown); 
     } 
     catch (Exception ex) { 
      System.out.println(ex.getMessage()); 
     } 
    } 
} 

... 

@Before 
public void setUp() { 
    cu = mock(ClassUnknown.class); 
    // The next two lines seems to be wrong 
    when(cu.methodUnknown("hello")).thenReturn("hello there"); 
    when(cu.methodUnknown("???")).thenThrow(new Exception("don't know")); 

    mc = new MyClass(cu); // Now, the MyClass instance will use the mock.   
} 

Это известно как инъекции зависимостей , Крайне важно иметь проверенный код. MyClass зависит от ClassUnknown. Поэтому MyClass не создает собственной зависимости. Вместо этого вы вводите зависимость (то есть экземпляр ClassUnknown) внутри MyClass.

+0

Спасибо. Я добавляю, чтобы добавить исключение throw в SetUp(), иначе IDE будет помечать класс неправильно, но не работает. Действительно ли необходимо добавить броски в SetUp()? – ken