2017-03-23 60 views
3

這是我服務的代碼:嘲諷與例外的Mockito:意外的異常錯誤

public class Service { 
    public Object serviceMethod() throws MyException { 
     @Autowired 
     Dao dao; 

     try { 
     return dao.dao_method(); 
     } catch (ExceptionFromDaoMethod e) { 
     throw (new MyException()); 
     } 
    } 
} 

我想寫一個簡單的單元測試;這是我的測試案例:

@Mock 
Dao dao; 

@InjectMocks 
Service service; 

@Test(expected=MyException.class) 
public void shouldReturnMyException throws MyException { 
    when(service.serviceMethod()).thenThrow(new MyException()); 
} 

測試失敗,因爲我有一個意外的異常:

預期的例外是MyException但 org.mockito.exception.base.MockitoException

爲什麼?解決辦法是什麼?

更新 感謝@Maciej科瓦爾斯基我注意到,我用的是狀態與一個真正的類,而不是對一個嘲笑一個。 因此,我在單元測試中將註釋@Spy添加到服務中。
新測試的代碼是:

@Mock 
Dao dao; 

@InjectMocks 
@Spy 
Service service; 

@Before 
MockitoAnnotations.initMocks(this); 

@Test(expected=MyException.class) 
public void shouldReturnMyException throws MyException { 
    doThrow(new MyException()).when(service.serviceMethod()); 
} 

但現在我有這樣的問題:

預期的例外是MyException但

回答

1

你將不得不@spy的服務,因爲我假設你正在使用它作爲被調用的實際實現的實例。

那麼試試這個:

@InjectMocks 
@Spy 
Service service; 

@Test(expected=MyException.class) 
public void shouldReturnMyException throws MyException { 
    doThrow(new MyException()).when(service).serviceMethod(); 
} 

記得嘲諷一個@Spy何時開始與doXX。

更新

如果你想嘲笑道呼叫(這是一個更好的測試候選人..),你將不得不作出一些變化,如果你只是想使用普通的Mockito。

如果道是不是你的實例依賴,那麼你將不得不改變你的刺法:

public class Service { 
    public Object serviceMethod() throws MyException { 
     Dao dao = getDaoInstance(); 
     try { 
     return dao.dao_method(); 
     } catch (ExceptionFromDaoMethod e) { 
     throw (new MyException()); 
     } 
    } 

    Dao getDaoInstance(){ 
     return new Dao(); 
    } 
} 

而且你的測試類應該我或多或少是這樣的:

@Mock 
Dao dao; 

@Spy 
Service service; 

@Test(expected=MyException.class) 
public void shouldReturnMyException throws MyException { 
    doReturn(dao).when(service).getDaoInstance(); 

    when(dao.dao_method()).thenThrow(new ExceptionFromDaoMethod()); 

    service.serviceMethod(); 
} 
+0

你能解釋我爲什麼我的解決方案是錯誤的嗎?此外,在你的解決方案是(service.serviceMethod())或何時(service).serviceMethod()? – PenguinEngineer

+0

現在意外的異常預計爲MyException,但是是 PenguinEngineer

+0

您試圖模擬一個不是Mock或Spy的實例,因此這樣做不會影響或引發Mockito異常。是的,當你嘲笑你使用的間諜方法。當(service).serviceMethod();'句法。 –

0

最後我找到了一個解決方案:爲Spring項目創建單元測試比我預期的更具挑戰性(至少僅使用Mockito框架),所以我找到了一個解決方案,使用一些Spring註解

所以這是我的新工作測試:

@MockBean 
Dao dao; 

@Autowired 
Service service; 

@Test(expected=MyException.class) 
public void shouldReturnMyException throws MyException { 
    when(dao.dao_method()).thenThrow(new ExceptionFromDaoMethod()); 
}