2017-04-18 144 views
0

我想使用Spring Boot進行集成測試,但發佈請求不起作用。方法saveClientePessoaFisica永遠不會被調用,並且不會返回任何類型的錯誤!我只是嘗試使用get方法進行其他測試,並且它正常工作。春季啓動測試MockMvc執行後 - 不能正常工作

@RunWith(SpringRunner.class) 
@SpringBootTest 
@AutoConfigureMockMvc 
@ActiveProfiles("dev") 
public class ClienteControllerIT { 

    @Autowired 
    private MockMvc mvc; 


    @Test 
    public void nao_deve_permitir_salvar_cliente_pf_com_nome_cpf_duplicado() throws Exception { 

     this.mvc.perform(post("/api/cliente/pessoafisica/post") 
       .contentType(MediaType.APPLICATION_JSON) 
       .content("teste") 
       .andExpect(status().is2xxSuccessful()); 
    } 

} 

@RestController 
@RequestMapping(path = "/api/cliente") 
public class ClienteController { 

    @Autowired 
    private PessoaFisicaService pessoaFisicaService; 


    @PostMapping(path = "/pessoafisica/post", consumes = MediaType.APPLICATION_JSON_VALUE) 
    public ResponseEntity<Void> saveClientePessoaFisica(@RequestBody PessoaFisica pessoaFisica) throws Exception { 

     this.pessoaFisicaService.save(pessoaFisica); 

     return new ResponseEntity<Void>(HttpStatus.CREATED); 
    } 

} 

回答

1

你的內容 「阿泰斯特」 沒有有效的JSON。當我使用你的代碼時,我得到一個JsonParseException的抱怨(順便說一下,在內容(「teste」)後面缺少一個括號)。使用andDo(print())也會很有幫助,它會給你更詳細的請求和響應:

@Test 
public void nao_deve_permitir_salvar_cliente_pf_com_nome_cpf_duplicado() throws Exception { 

    this.mvc.perform(post("/api/cliente/pessoafisica/post") 
      .contentType(MediaType.APPLICATION_JSON) 
      .content("teste")) 
      .andDo(print()) 
      .andExpect(status().is2xxSuccessful()); 
} 
1

有些事情要尋找:

  • 在mockmvc
  • 使您mockmvc啓用日誌記錄正常
  • 當使用彈簧安全,初始化它mockmvc
  • 當使用彈簧安全/ CSRF/HTTP POST,在您的mockmvc中傳遞一個csrf
  • 啓用調試日誌記錄

像這樣:

logging: 
    level: 
    org.springframework.web: DEBUG 
    org.springframework.security: DEBUG 

工作測試:

@RunWith(SpringRunner.class) 
@SpringBootTest 
@ActiveProfiles("test") 
@AutoConfigureMockMvc 
public class MockMvcTest { 

    @Autowired 
    protected ObjectMapper objectMapper; 

    @Autowired 
    private MockMvc mockMvc; 

    @Autowired 
    private WebApplicationContext webApplicationContext; 

    @Before 
    public void init() throws Exception { 
     mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build(); 

    } 

    @Test 
    public void adminCanCreateOrganization() throws Exception { 

     this.mockMvc.perform(post("/organizations") 
       .with(user("admin1").roles("ADMIN")) 
       .with(csrf()) 
       .contentType(APPLICATION_JSON) 
       .content(organizationPayload("org1")) 
       .accept(APPLICATION_JSON)) 
       .andDo(print()) 
       .andExpect(status().isCreated()); 

    } 

} 
+0

非常感謝!這個日誌提示非常有用! –

+0

自動裝配的mvcMock在init方法中被替換。另外,如果您需要使用簡單的用戶和角色,可以使用@WithMockUser(username =「admin1」,roles =「ADMIN」)更好地標註測試函數。 – EliuX

+0

非常感謝您提供這個調試提示!非常有用和實用 – kidnan1991