SpringMVC中的模拟服务

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

我对Spring MVC中的模拟服务有一个问题:

@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"))
                    )
            )));
}