2016-11-03 11 views
1

私のSpringアプリケーションをテストしたい。認証が必要なので、ユーザオブジェクトを作成して@Beforeメソッドに保持します。しかし、私は、init()メソッドが別のセッションで実行されると思うので、私は認証を行うことができません。SpringブートとEntityManagerによるセキュリティ統合テスト

IntegrationTestクラス:

@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT) 
@Transactional 
public class IntegrationTest { 

    @PersistenceContext 
    private EntityManager entityManager; 

    @Autowired 
    private PasswordEncoder passwordEncoder; 

    @LocalServerPort 
    int port; 

    private String URL; 

    @Before 
    public void init() { 
     User user = new User(); 
     user.setUsername("testUser"); 
     user.setPassword(passwordEncoder.encode("test")); 
     user.setEmail("[email protected]"); 
     user.setEnabled(true); 
     entityManager.persist(user); 
     entityManager.flush(); 
     entityManager.clear(); 

     RestAssured.port = port; 

     URL = "http://localhost:" + String.valueOf(port) + "https://stackoverflow.com/users/user"; 
    } 

    @Test 
    public void givenNotAuthenticatedUser_whenLoggingIn_thenCorrect() { 
     final RequestSpecification request = RestAssured.given().auth().basic("testUser", "test"); 

     request.when().get(URL).then().assertThat().statusCode(200); 
    } 
} 

しかし、私は私のuserRepositoryを使用し、すべてが正常に動作します

entityManager.persist(user); 
entityManager.flush(); 
entityManager.clear(); 

代わりの

userRepository.save(user); 

を呼び出す場合。注釈を@Transactionalも削除する必要があります。

最初に私はそれがコミットがなかったからだと思った - ユーザーテーブルに変更がないことがわかった。 EntityManagerにデータをコミットする方法

EntityManagerのテストの使い方は?そして、なぜUserRepositoryがうまく機能するのですか? documentationで述べたように

答えて

-1

デフォルトでは、フレームワークが作成し、各テストのためのトランザクションをロールバックします。

あなたのテストクラスに@Commitを使用して、それをオーバーライドしてentityManager.clear()TestTransaction.end()を置くことができます。

今、テストは正常ですが、トランザクションをコミットすることなく、なぜUserRepositoryの理由とその理由を理解できません。

+0

なぜdownvoteですか?私の質問には3つの部分があり、これは「EntityManagerにデータをコミットさせる方法」の答えです。 –

関連する問題