SpringMVC中的模拟服务
我对Spring MVC中的模拟服务有一个问题:SpringMVC中的模拟服务,spring,testing,spring-boot,mocking,mockito,Spring,Testing,Spring Boot,Mocking,Mockito,我对Spring MVC中的模拟服务有一个问题: @Controller public class CompanyController { @Autowired private CompanyService companyService; @Autowired private CompanyRelationService companyRelationService; @GetMapping({"/", "/companies"}) public String di
@Controller
public class CompanyController {
@Autowired
private CompanyService companyService;
@Autowired
private CompanyRelationService companyRelationService;
@GetMapping({"/", "/companies"})
public String displayCompanies(Model model) {
model.addAttribute("company", new Company());
List<Company> companies = companyService.findAll();
model.addAttribute("companies", companies);
return "companies";
}
}
问题是为什么我从真实服务而不是模拟服务中获得公司(公司1,公司2):
更新了测试类,删除了安装程序并将@Bean更改为@MockBean,但仍保留@SpringBootTest,它可以工作:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class CompanyTests {
@MockBean
private CompanyService companyServiceMock;
@Autowired
private MockMvc mockMvc;
@Test
@WithMockUser(roles = "ADMIN")
public void shouldListAllCompanies() throws Exception {
Company company1 = new Company("company1", new Address());
Company company2 = new Company("company2", new Address());
when(companyServiceMock.findAll()).thenReturn(Arrays.asList(company1, company2));
mockMvc.perform(get("/companies"))
.andExpect(status().isOk())
.andExpect(view().name("companies"))
.andExpect(model().attribute("companies", hasSize(2)))
.andExpect(model().attribute("companies", hasItem(
allOf(
hasProperty("name", is("companyFromRealService1")))
)))
.andExpect(model().attribute("companies", hasItem(
allOf(
hasProperty("name", is("companyFromRealService2"))
)
)));
}
}首先,如果您只是测试应用程序的控制器部分,那么应该使用
@WebMvcTest
注释,而不是@springbootest
(您可以找到更多信息)。您可以这样使用它:@WebMvcTest(CompanyController.class)
其次,为什么在setUp()
方法中使用MockMvc
会遇到麻烦?您可以按照人们在评论和Autowire中的建议删除setUp
方法
最后,当您使用spring boot时,最好使用
@MockBean
而不是@Mock
,后者是spring库中它的包装版本。在get(“/companys”)
上会发生什么?我想这叫真正的服务。用模拟结果替换调用当然他们不会。。。您正在使用框架。SpringBoot做了大量的工作来注入和模拟依赖项,您要做的第一件事就是销毁所有这些工作。删除您的@Before
方法,并将@Autowired
放在MockMvc
字段上,然后重新启动测试。@StanislavL我该怎么做?您使用的是哪个Spring启动版本?将@AutoConfigureMockMvc
添加到测试类中。将@Mock
替换为@MockBean
。感谢您的回答。我做到了,现在我有了java.lang.IllegalStateException:未能加载应用程序上下文错误。@Helosze,你能用当前的测试类更新你的答案吗?当我将Mock更改为MockBean,但没有将SpringBootTest更改为WebMvcTest时,现在works@Helosze,很乐意帮忙。您可能仍然希望更新您的问题的测试类最终形式,以便人们可以很容易地在将来看到它,如果他们最终在这个问题上。如果它解决了你的问题,你可以接受这个答案:)当然可以。我已经编辑过了。但也许把这个SpringBootTest改成WebMVCTTest会很好:)谢谢你的帮助!
java.lang.AssertionError: Model attribute 'companies'
Expected: a collection containing (hasProperty("name", is "company1"))
but: hasProperty("name", is "company1") property 'name' was "companyFromRealService",
hasProperty("name", is "company1") property 'name' was "CompanyFromRealService2"
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class CompanyTests {
@MockBean
private CompanyService companyServiceMock;
@Autowired
private MockMvc mockMvc;
@Test
@WithMockUser(roles = "ADMIN")
public void shouldListAllCompanies() throws Exception {
Company company1 = new Company("company1", new Address());
Company company2 = new Company("company2", new Address());
when(companyServiceMock.findAll()).thenReturn(Arrays.asList(company1, company2));
mockMvc.perform(get("/companies"))
.andExpect(status().isOk())
.andExpect(view().name("companies"))
.andExpect(model().attribute("companies", hasSize(2)))
.andExpect(model().attribute("companies", hasItem(
allOf(
hasProperty("name", is("companyFromRealService1")))
)))
.andExpect(model().attribute("companies", hasItem(
allOf(
hasProperty("name", is("companyFromRealService2"))
)
)));
}