私はいつも自分のコードを(単体テストで)どれだけテストすべきか疑問に思いました。
私がこのコンポーネントを持っているとしましょう:
@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;
}
}
それを本当に徹底的にテストするには、EventとEntityManagerをモックする必要があります。次に、これらのどれを行う必要がありますか?
- entityManagerのメソッドcreateQueryが、指定されたJPQLステートメントで1回だけ呼び出されることを確認します。
- メソッドsetParameterが、指定されたパラメーターで1回だけ呼び出されることを確認します。
- メソッドgetSingleResultが1回だけ呼び出されることを確認します。
- 指定されたパラメーターでイベントが1回だけ発生することを確認します。
- 正しいユーザーが返されることをテストします。
全て?実装を少し変更するたびに、テストで変更を行う必要があるため、非常に侵襲的であるように思われます。
私は私が関連していると思う2つの少し異なる質問があります。
Q2:arquillian webisteで、あなたはこれを読むことができます:
Arquillianでは、モックを捨てて実際のテストを作成しましょう。
モックオブジェクトを使うべきではないということですか?どうすれば(arquillianを使用して)コードを本当に徹底的にテストできますか?
Q3:TDDによると、最初にテストを作成し、次に実装を作成する必要があります。しかし、実装もAPIも持っていないので、テストがコンパイルされない場合、どのようにそれを実行したいですか?