【发布时间】:2018-01-30 19:10:57
【问题描述】:
我在从未模拟的方法中获取结果时遇到问题。我不想模拟结果,而是想从这种方法中获得真正的结果。该方法在应用程序中有效,所以这不是问题。我有一个测试:
@Test
public void shouldGetCompaniesToSelect() throws Exception {
Company company = new Company("company", new Address());
Company relatedCompany1 = new Company("relatedCompanyName1", new Address());
Company notRelatedCompany = new Company("notRelatedCompanyName", new Address());
Company relatedCompany2 = new Company("relatedCompanyName2", new Address());
CompanyRelation companyRelation1 = new CompanyRelation(relatedCompany1);
CompanyRelation companyRelation2 = new CompanyRelation(relatedCompany2);
company.getCompanyRelations().add(companyRelation1);
company.getCompanyRelations().add(companyRelation2);
when(companyServiceMock.findAll()).thenReturn(Arrays.asList
(company, relatedCompany1, notRelatedCompany, relatedCompany2));
when(companyServiceMock.findOne(1L)).thenReturn(company);
List<Company> companiesToSelect = companyServiceMock.findCompaniesToSelect(company);
mockMvc.perform(get("/company/1"))
.andExpect(model().attribute("companiesToSelect", hasSize(1)))
.andExpect(model().attribute("companiesToSelect", hasItem(
hasProperty("relatedCompany", hasProperty(
"name", is("notRelatedCompanyName")
)))));
}
有 2 个模拟方法(findAll 和 findOne),然后我想执行方法并从 findCompaniesToSelect(公司 - 这是为测试创建的对象)中获得真实结果。 companyToSelect 的大小应该是 1,但它返回 0。
findCompaniesToSelect 方法:
public List<Company> findCompaniesToSelect(Company company) {
List<Company> companiesToSelect = companyRepository.findAll();
for (CompanyRelation companyRelation :
company.getCompanyRelations()) {
companiesToSelect.remove(companyRelation.getRelatedCompany());
}
companiesToSelect.remove(company);
return companiesToSelect;
}
我该怎么做?
编辑 1:
好的,所以我把它改成@Spy,把存根改成:
Mockito.doReturn(Arrays.asList(company, relatedCompany1,
notRelatedCompany, relatedCompany2)).when(companyServiceMock).findAll();
Mockito.doReturn(company).when(companyServiceMock).findOne(1L);
但是当我运行测试时,findCompaniesToSelect() 方法使用的是真实公司而不是模拟公司。
好的,所以现在的问题是当调用 findCompaniesToSelect() 方法时,调用的是 companyRepository.findAll 方法。我想从测试中调用模拟的 findAll 方法来获取模拟的公司而不是真实的公司。
编辑 2:
好的,问题是因为 findCompaniesToSelect() 方法使用存储库,而不是服务。 :D
【问题讨论】:
标签: java spring testing mocking mockito