2012-06-11 42 views
0

我總是想知道我應該測試我的代碼的多少(單元測試)。我應該單元測試我的代碼多少錢

比方說,我有這個組件:

@Stateless 
public class UserManager { 
    @PersistenceContext 
    EntityManager entityManager; 

    @Inject 
    Event<UserEvent> event; 

    public User getUserByUsername(String username) { 
     User user = entityManager 
        .createQuery("SELECT u FROM User u WHERE u.username = :username", User.class) 
        .setParameter("username", username) 
        .getSingleResult(); 
     event.fire(new UserEvent("some message")); 

     return user; 
    } 
} 

要真正徹底地測試它,我應該嘲笑事件和EntityManager的。 那我應該怎麼做?

  • 驗證entityManager上的createQuery方法只在給定的JPQL語句中調用一次。
  • 驗證setParameter方法是否與給定參數一起被調用一次。
  • 確認方法getSingleResult只被調用一次。
  • 驗證事件是否與給定參數一起被觸發。
  • 測試是否返回了正確的用戶。

全部?在我看來,這是非常有侵略性的,因爲在我的測試中需要完成的變化中的每個小改動都會導致變化。

我有兩個有點不同的問題,我認爲是相關的。

Q2:在的Arquillian webiste,你可以看到這一點:

的Arquillian咱們你溝嘲笑和編寫真正測試。

是否意味着我不應該使用模擬對象?怎麼能(用arquillian)我真的徹底測試我的代碼呢?

問題3:根據TDD,您應該先編寫測試,然後再編寫測試。但是如果你沒有實現或api,你想怎麼做,所以測試不會編譯?

回答

1

我一直想知道我應該測試我的代碼的多少(單元測試)。

如果您在DAL中沒有業務邏輯,那麼我會說:不要寫(純粹的)單元測試,寫集成測試。先寫集成測試測試。

我這樣說,因爲你做得很少,大多數有趣的東西發生在數據庫或ORM中,這就是問題出現的地方。

我可能會考慮的唯一(純粹的)單元測試就是顯示事件被觸發的單元測試。

我不知道Arquillian是如何工作的,並且考慮到需要少量的「世界」,我可能不會將它用於此測試。相反,我只是在測試方法中新增了一個EntityManager並將其傳遞給下面。我很可能會嘲笑Event<UserEvent>

這是否意味着我不應該使用模擬對象?

嘲笑(和其他假貨)是一種工具。它們可能非常有用。但是他們不能解決所有問題,也不能用來測試每​​一件事情。

根據TDD,您應該先編寫測試,然後再編寫測試。但是,如果你沒有實現或api,你想怎麼做呢?

這些測試可以幫助你計算出API。

所以測試不會編譯?

失敗。修復失敗並重新運行測試。

1

問題3:根據TDD,您應該先編寫測試,然後再編寫測試。但是如果你沒有實現或api,你想怎麼做,所以測試不會編譯?

測試應編譯但失敗。您可以在類定義中存儲方法,以便在編寫測試時顯示它們,但方法體在運行測試之前不應該執行。

相關問題