java - 使い方 - powermockito




Mockitoを使ってDAOメソッドをテストするには? (3)

しかし、私もDAOとデータベースの動作をテストしたいのですが?

実際にデータベースをテストする必要がある場合は、実際のデータベースが必要です。 Mockitoは、偉大な図書館であるにもかかわらず、おそらくこの仕事の間違ったツールです。

私はMockitoライブラリを発見し始めましたが、適切な答えが見つからなかったという質問があります。

たとえば、データベースにユーザーを保存するUserDAOクラスのメソッドがあるとします。

public class UserDAO{
...
 public void create(User user) {
        Connection connection = null;
        PreparedStatement pstmt = null;
        ResultSet generatedKeys = null;
        try {

            connection = getConnection();
            pstmt = connection.prepareStatement(INSERT_USER,
                    PreparedStatement.RETURN_GENERATED_KEYS);
            int counter = 1;
            pstmt.setString(counter++, user.getFirstName());
            pstmt.setString(counter++, user.getLastName());
            pstmt.setString(counter++, user.getEmail());
            pstmt.setString(counter++, user.getPassword());
            pstmt.setString(counter++, user.getRole());
            pstmt.setString(counter, user.getLang());

            pstmt.execute();
            connection.commit();
            generatedKeys = pstmt.getGeneratedKeys();

            if (generatedKeys.next()) {
                user.setId(generatedKeys.getInt(Fields.GENERATED_KEY));
            }
        } catch (SQLException e) {
            rollback(connection);
            LOG.error("Can not create a user", e);
        } finally {
            close(connection);
            close(pstmt);
            close(generatedKeys);
        }
    }
  ....
}

どうすればテストできますか?

例えばDAOクラスをテストする場合、 DataSourceモック、 Connectionモック、 ResultSetモックなどを作成する必要がありますか? データベース自体をテストしないようにしますか?

しかし、私もDAOとデータベースの動作をテストしたいのですが?

いくつかのコードサンプルを作成してください。役立つリンクがあり、最良のアプローチを示してください。


JUnitと組み合わされたDBUnitようなツールは、データベースでDAOをテストするのに役立ちます。 DBUnitを使用すると、UnitTestの前にデータベースにテストデータを挿入し、テスト後にデータベース内のデータを期待どおりに比較することができます。


テストする方法は次のとおりです。

public class UserDAOTest extends IntegrationTests
{
    // Or do it in a @Before method, if needed.
    UserDAO dao = new UserDAO();

    @Test
    public void createValidUser() {
        User validUser = new User(
            "John", "Smith", "[email protected]", "[email protected]",
            "admin", "en"); // or use setters as needed

        dao.create(validUser);

        assertEntityCreatedInDB(validUser);
    }

    @Test
    public void attemptToCreateInvalidUser() {
        User invalidUser = new User("", null, null, "", null, "XY");

        dao.create(invalidUser);

        // This really shouldn't be done this way, as DAOs are not supposed
        // to manage transactions; instead, a suitable, descriptive
        // exception should be thrown by the DAO and checked in the test.
        assertTransactionWasRolledBack();
    }
}

上記についてのカップルノート:

1)テストは短くてシンプルで、分かりやすいように見えます 。 もし彼らが別の答えの中で大きくて醜いと思えば、根本的に何かをやっているのです。

2)テストコードには、実際のテストからの厄介なJDBC / ORMアクセスを隠すIntegrationTestsベースクラスなど、独自のインフラストラクチャヘルパーを持つことができます。 私はいくつかのプロジェクトでそのようなヘルパーを実装しました。だから私はこれを行うことができますが、それは他の質問のためのものになるでしょう。





dao