2017-12-12 11 views
0

私はいくつかのテストコードを書いています。 私はspring-boot 1.5.9.RELEASEを使用します。spring-data-jpaとMockMvcを使ったスプリングブートjunitテスト

これは私のテストコードsampleUserで

@Test 
public void shouldUpdateUserName() throws JsonProcessingException, Exception { 
    for(UserDto.Request request: userRequests) { 
     User user = new User(); 
     user.setName(request.getName()); 
     user.setCity(cityRepository.findTopByName(request.getCity())); 

     userRepository.save(user); 
    } 

    UserDto.Request sample = userRequests.get(new Random().nextInt(count)); 
    User sampleUser = userRepository.findTopByName(sample.getName()); 

    String userNameAfterUpdate = sampleUser.getName() + Thread.currentThread().getName(); 

    UserDto.Request request = new UserDto.Request(); 
    request.setCity(sampleUser.getCity().getName()); 
    request.setName(userNameAfterUpdate); 

    mockMvc.perform(put("/user/" + sampleUser.getId()) 
      .contentType(MediaType.APPLICATION_JSON) 
      .content(objectMapper.writeValueAsString(request))) 
     .andDo(print()) 
     .andExpect(status().isOk()); 

    assertNotEquals(sampleUser.getName(), userRepository.findOne(sampleUser.getId()).getName()); 
    assertEquals(userNameAfterUpdate, userRepository.findOne(sampleUser.getId()).getName()); 
} 

です。私はユーザーオブジェクトを見つけて取得します。 とmockMvc.perform()にあります。私はIDでユーザーを見つけて更新します。

しかし、私は同じオブジェクトを取得します。 mockMvcはsampleUserオブジェクトを更新します。 test assertNotEqualsは失敗します。

どのように起こったのですか? 助けてください。

+0

あなたは、トランザクション、@トランザクション、一般的にあなたのデータソースを使用している可能性のある場所についての追加情報を提供できますか? –

答えて

0

これはトランザクションの影響です。 1つのトランザクション(T1)で使用をロードします。

その後、MockMvcを使用して、別のトランザクション(T2)を実行してユーザーを変更します。

あなたのテストは依然としてトランザクションT1にあり、変更は表示されません。実際にはJPAの振る舞いのせいで、データベースにアクセスすることはなく、単にエンティティマネージャから引き出すだけです。

テストでこれを簡単に修正する方法はありません。 代わりに、2つ以上の個別のテストでテストを分割することをお勧めします。

MVCセットアップを検証して、正しいメソッドが呼び出され、予想されるHTTPステータスコードとコンテンツが返されることを確認します。

メソッドが実際にエンティティの予想される変更を行い、リポジトリを呼び出すことを保証する別個のテストです。

両方のテストでは間違いなく偽のリポジトリを使用する必要があります。

関連する問題