0

Mockito と TDD は初めてだと言わざるを得ません..使用する理由を見つけるのに苦労しています..特に次のような問題を見つけた場合..「RegisterUser」メソッドをテストしたい私のUserServiceクラス..Spring MVC 3.0.6、Hibernate、Mavenなどを使用しています..

@Override
public void registerUser(User user, UserRoles userRole) throws DataAccessException, UserExistingException {
    checkExistingUser(user);
    user.addRole(new Role(userRole));
    String password = encryptPassword(user);
    userRepository.makePersistent(user);
    sendWelcomeEmail(user.getFirstname(), user.getUsername(), password, user.getEmail());
}

private void checkExistingUser(User user) throws UserExistingException {
    List<User> users = userRepository.findByCriteria(Restrictions.or(Restrictions.eq("username", user.getUsername()), Restrictions.eq("email", user.getEmail())));
    if (!CollectionUtils.isEmpty(users)) {
        User userFound = users.get(0);
        List<String> fields = new ArrayList<String>();
        if (userFound.getUsername().equals(user.getUsername())) {
            fields.add("username");
        }
        if (userFound.getEmail().equals(user.getEmail())) {
            fields.add("email");
        }
        throw new UserExistingException(fields);
    }
}

これをテストするには、「userRepository.findByCriteria ..」をモックする必要があり、次のjunitテストを試しました

@Test(expected = UserExistingException.class)
public void registerExistingUserTest() throws DataAccessException, UserExistingException {
    User user = new User();
    user.setUsername("gfalco77");
    user.setEmail("Giuseppe.falco@gmail.com");
    List<User> users = new ArrayList<User>();
    users.add(user);


    Mockito.when(userRepository.findByCriteria(Restrictions.or(Restrictions.eq("username", user.getUsername()), Restrictions.eq("email", user.getEmail())))).thenReturn(users);
    userService.registerUser(user, UserRoles.ROLE_USER);
    Mockito.verify(userRepository).makePersistent(user);
}

しかし、「ユーザー」リストは常に空のようです..以前の投稿で、制限は同じオブジェクトではなく、Matchers を使用する必要があるかもしれないと読みました..しかし、どのように? そして、私がマッチャーを使用する場合..それはまだ有効であり、何か違うものでテストを作成しますか?

4

1 に答える 1

3

質問に対する直接的な回答ではありませんが、サービス クラスにビジネス コードとデータ アクセス コードが混在しているため、テストを記述するのは困難です。呼び出しは、次のようなfindByCriteria高レベルのメソッドにカプセル化する必要がありますUserRepository

List<User> findByNameOrEmail(String name, String email)

テストでこの単純なメソッドをモックし、実際のリポジトリ単体テストを作成findByNameOrEmailして、テスト データベースで期待どおりに動作することをテストするだけです。

UserRepository がfindByCriteriaまたはなどの一般的なメソッドのみを公開する場合findByQuery、基準またはクエリの作成は呼び出し元の責任であり、リポジトリの責任ではないため、実際にはもはやリポジトリではありません。これを行っても、ビジネス サービスで直接 Hibernate セッションを使用する以上のことはありません。

于 2011-12-12T23:01:13.397 に答える