Весенний тест контроллера загрузки, mockMov не дразнит
Я использую Spring MVC и Spring boot для написания сервиса Restful. Этот код прекрасно работает через почтальон. Когда я выполняю модульный тест для контроллера, чтобы принять почтовый запрос, mocked myService всегда будет инициализировать себя вместо того, чтобы возвращать поддельное значение, определенное когда...thenReturn... Я использую verify(MYSERVICE, раз (1)) executeRule(любой (MyRule.class)). и это показывает, что макет не используется. Я также пытался использовать standaloneSetup для mockMoc, но он жалуется, что не может найти сопоставление для пути "/api/rule". Кто-нибудь может помочь разобраться в проблеме?
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
public class MyControllerTest {
@Mock
private MyService myService;
@InjectMocks
private MyController myRulesController;
private MockMvc mockMvc;
@Autowired
private WebApplicationContext wac;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
}
@Test
public void controllerTest() throws Exception{
ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
Long userId=(long)12345;
MyRule happyRule = MyRule.createHappyRule(......);
List<myEvent> mockEvents=new ArrayList<myEvent>();
myEvents.add(new MyEvent(......));
when(myService.executeRule(any(MyRule.class))).thenReturn(mockEvents);
String requestBody = ow.writeValueAsString(happyRule);
MvcResult result = mockMvc.perform(post("/api/rule").contentType(MediaType.APPLICATION_JSON)
.content(requestBody))
.andExpect(status().isOk())
.andExpect(
content().contentType(MediaType.APPLICATION_JSON))
.andReturn();
verify(MyService,times(1)).executeRule(any(MyRule.class));
String jsonString = result.getResponse().getContentAsString();
}
}
Ниже мой класс контроллера, где MyService является интерфейсом. И я реализовал этот интерфейс.
@RestController
@RequestMapping("/api/rule")
public class MyController {
@Autowired
private MyService myService;
@RequestMapping(method = RequestMethod.POST,consumes = "application/json",produces = "application/json")
public List<MyEvent> eventsForRule(@RequestBody MyRule myRule) {
return myService.executeRule(myRule);
}
}
1 ответ
Является ли API вашим контекстным корнем приложения? Если это так, удалите корневой контекст из URI запроса и проверьте. Если вы пропустите корень контекста, вы получите 404. Если вы собираетесь передать корень контекста, обратитесь к приведенному ниже тестовому примеру. Надеюсь это поможет.
@RunWith(MockitoJUnitRunner.class)
public class MyControllerTest {
@InjectMocks
private MyController myRulesController;
private MockMvc mockMvc;
@Before
public void setup() {
this.mockMvc = standaloneSetup(myRulesController).build();
}
@Test
public void controllerTest() throws Exception{
ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
MyController.User user = new MyController.User("test-user");
ow.writeValueAsString(user);
MvcResult result = mockMvc.perform(post("/api/rule").contentType(MediaType.APPLICATION_JSON).contextPath("/api")
.content(ow.writeValueAsString(user)))
.andExpect(status().isOk())
.andExpect(
content().contentType(MediaType.APPLICATION_JSON))
.andReturn();
}
}
Ниже находится контроллер
/**
* Created by schinta6 on 4/26/16.
*/
@RestController
@RequestMapping("/api/rule")
public class MyController {
@RequestMapping(method = RequestMethod.POST, consumes = "application/json", produces = "application/json")
public User eventsForRule(@RequestBody User payload) {
return new User("Test-user");
}
public static class User {
private String name;
public User(String name){
this.name = name;
}
}
}