2016-03-26 13 views
0

私のユニットテストでは、いくつかのエンティティを永続化し、それらのデータベースからの検索をテストしたいと思います。彼らは救われていませんでした。テストメソッドに@Transactionという注釈が付いていた場合、メソッドがエラーなく終了しても、その内部で起こったことはすべて保持されませんでした。@Transaction注釈付きメソッドはデータをデータベースに保存しません

多対多の遅延ロードされた関連付けを混乱させ、@Transactionというメソッドで注釈を付けると、問題が解決されたように見えたので、私はそれを使用しています。

エンティティが保存されない理由は何でしょうか?トランザクションが失敗しないため、トランザクションをロールバックする理由はありません。関連するクラスの

コード:

@Test 
@Transactional 
public void plainPersistence() throws NullParameterException { 
    User user = userHelper.createUser("User1", "password", null, null); 

    Assert.assertNotNull(userDAO.findByUsername("User1")); 
} 

userHelper:

@Service 
public class UserHelper { 
    @Autowired 
    private UserDAO userDAO; 


    public User createUser(...) throws NullParameterException { 
     User newUser = new User(username, ...); 

     userDAO.save(newUser); 

     return newUser; 
    } 

UserDAOのsave()方法は、その後に呼び出したsave()UserRepository上:あなたは可能性が高いですので

@Repository 
public interface UserRepository extends CrudRepository<User, Long> { 
    public User findByUsername(String username); 
} 

答えて

0

Spring testを使用すると、デフォルトの動作が変更をロールバックするように構成されていることに注意してください。あなたはそれ以外の場合は、ヘルプをし@Rollback(value = false)

+0

おかげでクラスに注釈を付ける春< 4.2

@TransactionConfiguration(defaultRollback = false) 

使用している場合は、これを変更するには、とあなたのテストクラスに注釈を付ける必要があります。今は例外が発生していますが、org.springframework.transaction.TransactionSystemException:JPAトランザクションをコミットできませんでした。入れ子にされた例外はjavax.persistence.RollbackExceptionです:トランザクションはrollbackOnly'としてマークされていますが、それは私が考えている進歩です –

+0

これは、ロジック自体で起こっている本当の例外によるものです。これを理解する必要があります –