2014-09-23 124 views
0

我有一些問題嘲笑方法(使用mockito),這取決於從輸入參數返回一個字符串或異常。嘲笑異常

單元測試的代碼似乎是錯誤的,但即使在詢問谷歌後我找不到解決方案。

感謝所有幫助

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的模擬實例。然後你在MyClass的實例上調用mainMethod()。此方法創建另一個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不會創建自己的依賴關係。相反,您在MyClass內注入依賴項(即ClassUnknown的實例)。

+0

謝謝。我添加了向SetUp()添加拋出異常,否則IDE將標記類錯誤,但不是它的工作。是否真的有必要添加到SetUp()? – ken 2014-09-23 07:13:24