2016-04-16 61 views
0

我对使用TestRestTemplate发出请求的Spring应用程序进行了集成测试。每次我提出请求时,模板都会返回一个实体,但id始终为空。如果我通过Postman做同样的事情,那么id不是null,所以我必须与测试本身有关,但我不知道它是什么。有人有想法吗?Sprint TestRestTemplate返回Id null

测试看起来是这样的:

@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有一些意义,所以它变成“保留”。如果您有权访问生成响应的服务器,则只需将该字段的名称更改为“Iid”,例如在Game类中。 getter getId()必须重命名为getIid()。