1

私はいつも自分のコードを(単体テストで)どれだけテストすべきか疑問に思いました。

私がこのコンポーネントを持っているとしましょう:

@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も持っていないので、テストがコンパイルされない場合、どのようにそれを実行したいですか?

4

2 に答える 2

1

Q3:TDDによると、最初にテストを作成し、次に実装を作成する必要があります。しかし、実装もAPIも持っていないので、テストがコンパイルされない場合、どのようにそれを実行したいですか?

テストはコンパイルされますが失敗します。クラス定義のメソッドをスタブ化して、テストの作成時に表示されるようにすることができますが、テストを実行する前にメソッド本体をまだ実装しないでください。

于 2012-06-11T20:58:37.017 に答える
1

私はいつも自分のコードを(単体テストで)どれだけテストすべきか疑問に思いました。

DALにビジネスロジックがない場合は、次のように言います。(純粋な)単体テストを記述せず、統合テストを記述します。最初に統合テストテストを作成します。

あなたがほとんど何もしていないので、私はこれを言います、楽しいことのほとんどはデータベースまたはORMで起こります、そしてそれは問題が起こるところです。

私が考えるかもしれない唯一の(純粋な)単体テストは、イベントが発生したことを示すためのものです。

Arquillianがどのように機能するかはわかりません。必要な「世界」の数が少ないことを考えると、このテストには使用しない可能性があります。むしろ、私EntityManagerはテストメソッドを新しくして、それを伝えたいと思います。私はおそらくをあざけるでしょうEvent<UserEvent>

モックオブジェクトを使うべきではないということですか?

モック(およびその他の偽物)はツールです。それらは非常に便利です。しかし、それらはすべての問題を解決するわけではなく、すべてのものをテストするために使用されるべきではありません。

TDDによると、最初にテストを作成し、次に実装を作成する必要があります。しかし、実装もAPIも持っていない場合、どのようにそれを行いたいですか?

テストは、APIの作成に役立ちます。

だからテストはコンパイルされませんか?

失敗。失敗を修正し、テストを再実行します。

于 2012-06-15T12:43:16.693 に答える