In my spring test when i use standaloneSetup (controller) the @Scope ("session") works fine. But when I change to webAppContextSetup (this.wac) the scope stop working.
My question is, why?
Controller:
@Controller
@RequestMapping("/pedido")
@Scope("session")
public class PedidoController {
@Autowired
private ClienteService clienteService;
@Autowired
private PedidoService pedidoService;
private Pedido pedido;
@Autowired private PedidoValidator validator;
@InitBinder
public void initBinders(WebDataBinder binder) {
binder.addValidators(validator);
}
@RequestMapping(method=RequestMethod.GET)
public ModelAndView homePedido(Pedido pedido) {
ModelAndView mv = new ModelAndView("pedidos-novo");
mv.addObject("clientes", clienteService.listarClientes());
mv.addObject("tiposComercializacao", pedidoService.listaTipoComercializacao());
mv.addObject("transportadoras", pedidoService.listaTransportadora());
mv.addObject("classificacoes", pedidoService.listaClassificacao());
mv.addObject("condpagtos", pedidoService.listaCondPagto());
mv.addObject("pedido", pedido);
mv.addObject("pedidoIniciado", !(this.pedido==null));
return mv;
}
@RequestMapping(path="/iniciar",method=RequestMethod.POST)
public ModelAndView iniciarPedido(@ModelAttribute("pedido") Pedido pedido, BindingResult result) {
this.pedido = pedido;
return this.homePedido(pedido);
}
@SuppressWarnings("rawtypes")
@RequestMapping(path="/pedidoiniciado",method=RequestMethod.GET)
public @ResponseBody ResponseEntity pedidoIniciado() {
if(this.pedido==null) {
return new ResponseEntity(HttpStatus.NO_CONTENT);
}
return ResponseEntity.ok(this.pedido);
}
}
TestContext:
@Configuration
@ComponentScan(basePackages = { "br.com.testes" })
@EnableWebMvc
public class SpringTestContext {
}
Test:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=SpringTestContext.class)
@WebAppConfiguration
@ActiveProfiles({ "test" })
public class PedidoControllerTest {
private MockMvc mockMvc;
@Autowired
private WebApplicationContext wac;
@Autowired
private PedidoController pedidoController;
private ObjectMapper objectMapper = new ObjectMapper();
private Pedido pedido;
@Before
public void setUp() throws Exception {
//This way the scope of controller doesn't work
mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
//This way works like a charm
//mockMvc = MockMvcBuilders.standaloneSetup(pedidoController).build();
}
@Test
public void abrirPedido() throws Exception {
MvcResult result = mockMvc.perform(
get("/pedido")
)
.andExpect(status().isOk())
.andExpect(view().name("pedidos-novo")).andReturn();
Map<String,Object> modelAndView = result.getModelAndView().getModel();
this.pedido = (Pedido)modelAndView.get("pedido");
}
@Test
public void iniciarPedido() throws Exception {
abrirPedido();
MvcResult result = mockMvc.perform(post("/pedido/iniciar").param("pedido", objectMapper.writeValueAsString(this.pedido)))
.andExpect(status().isOk())
.andExpect(view().name("pedidos-novo")).andReturn();
Map<String,Object> modelAndView = result.getModelAndView().getModel();
boolean pedidoIniciado = (boolean)modelAndView.get("pedidoIniciado");
assertTrue(pedidoIniciado);
}
@Test
public void pedidoIniciado() throws Exception {
mockMvc.perform(get("/pedido/pedidoiniciado"))
.andExpect(status().isNoContent());
//Inicia o pedido e realiza o teste novamente
iniciarPedido();
mockMvc.perform(get("/pedido/pedidoiniciado"))
.andExpect(status().isOk());
}
@Test
public void listaProdutosPedido() throws Exception {
iniciarPedido();
MvcResult result = mockMvc.perform(post("/produto/listar")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(this.pedido)))
.andExpect(status().isOk())
.andReturn();
List<Produto> listaProduto = objectMapper.readValue(result.getResponse().getContentAsString(), new TypeReference<List<Produto>>() {});
assertTrue(listaProduto!=null);
}
}