2016-04-16 4 views
0

私は、TestRestTemplateを使用してリクエストを行うSpringアプリケーションの統合テストを行っています。テンプレートを要求するたびに、テンプレートはエンティティを返しますが、idは常にnullです。私がPostman経由で同じことをすると、IDはnullではないので、テスト自体と何か関係があるはずですが、私はそれが何であるか分かりません。誰にもアイデアはありますか?Sprint TestRestTemplateがIdを返します。

テストは次のようになります。

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = Application.class) 
@WebIntegrationTest(randomPort = true) 
public class GameServiceControllerIT { 
    @Value("${local.server.port}") 
    private int port; 

    private URL base; 
    private RestTemplate template; 

    @Before 
    public void setUp() 
      throws Exception { 
     this.base = new URL("http://localhost:" + port + "/"); 
     this.template = new TestRestTemplate(); 
    } 

    @Test 
    public void testAddGame() { 
     User user = addUser(); 
     ResponseEntity<Game> gameEntity = template.exchange(base + "/games/new?token=" + user.getToken(), HttpMethod.POST, null, Game.class); 

     Assert.assertThat(gameEntity.getStatusCode(), is(HttpStatus.OK));    //This works 
     Assert.assertThat(gameEntity.getBody().getOwner(), is(user.getUsername()));  //This works too 
     Assert.assertThat(gameEntity.getBody().getId(), is(not(null)));     //This doesn't work 
    } 

APIエンドポイントは、次のようになります。私は同じ問題を発見した

@RequestMapping(value = CONTEXT + "/new", method = RequestMethod.POST) 
@ResponseBody 
@JsonView(Views.Public.class) 
public ResponseEntity<Game> createGame(@RequestParam("token") String token) { 

    Game game = new Game(); 
    User owner = userRepo.findByToken(token); 

    if (owner == null) { 
     return new ResponseEntity<>(HttpStatus.NOT_FOUND); 
    } 

    if (!UserUtils.isInOpenGame(owner)) { 
     owner.setCharacterType(CharacterType.CHEYENNE); 
     game.setOwner(owner.getUsername()); 
     game.setStatus(GameStatus.PENDING); 
     game.setCurrentPlayer(0); 
     game.getPlayers().add(owner); 
     game = gameRepo.save(game); 

     logger.info("Game " + game.getId() + " successfully created"); 
     return ResponseEntity.ok(game); 
    } else if (owner.getGames().size() > 0) { 
     logger.info("User already created or joined a game"); 
     return new ResponseEntity<>(HttpStatus.PRECONDITION_REQUIRED); 
    } else { 
     return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); 
    } 
} 

答えて

0

。どういうわけか、 "Id"フィールドはRestTemplateの意味を持ちますので、 "予約済み"になります。レスポンスを生成するサーバーにアクセスできる場合は、たとえばGameクラスのフィールドの名前を "Iid"に変更します。 getId()の名前をgetId()に変更する必要があります。