【发布时间】:2018-12-22 02:05:58
【问题描述】:
我使用 Eclipse 中运行的 JDK 1.8 进行了带注释的 Junit 4 测试。我正在使用 Mockito 来模拟被测服务类中的 DAO。抽象类中的 runner 扩展了 SpringJUnit4ClassRunner。当我运行测试时,会调用具体 DAO 类中未实现的方法,而不是模拟的方法。我已经搜索和搜索,似乎无法找到解决方案。我做错了什么?
已解决 - 我更改了 @InjectMocks @Autowired IOrganizationsService 组织服务;删除接口和自动装配,@InjectMocks OrganizationsService organizationsService;固定在下面,DAO 被嘲笑。现在的问题是,为什么声明中的 DAO 没有使用接口模拟?
@ContextConfiguration(classes = { AppXmlConfigTest.class, AppConfig.class }, inheritLocations = false)
@WebAppConfiguration
public class MockOrganizationsServiceTest extends AbstractCoreJunit4Test {
public MockOrganizationsServiceTest() {
super();
}
@InjectMocks
OrganizationsService organizationsService;
@Mock
IOrganizationsDao organizationsDao;
@Before
public void setupMock() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testGetOrganizations() {
LocalDate localDate = LocalDate.now();
List<OrganizationTypeEnum> organizationTypes = new ArrayList<OrganizationTypeEnum>();
organizationTypes.add(OrganizationTypeEnum.All);
List<AllocationStatusEnum> allocationStatuses = new ArrayList<AllocationStatusEnum>();
allocationStatuses.add(AllocationStatusEnum.ALL);
List<IOrganization> organizations = new ArrayList<IOrganization>();
IOrganization organization = new Organization();
organization.setOrganizationId(1);
organizations.add(organization);
Mockito.when(organizationsDao.getOrganizations(isA(LocalDate.class), isA(List.class), isA(List.class))).thenReturn(organizations);
List<IOrganization> orgs = organizationsService.getOrganizations(localDate, organizationTypes, allocationStatuses);
assertNotNull(orgs);
}
}
服务类是这样的,
public class OrganizationsService extends AbstractService implements IOrganizationsService {
@Autowired
IOrganizationsDao organizationsDao;
/**
* @param organizationsDao the organizationsDao to set
*/
public void setOrganizationsDao(IOrganizationsDao organizationsDao) {
this.organizationsDao = organizationsDao;
}
@Override
public List<IOrganization> getOrganizations(LocalDate effectiveDate, List<OrganizationTypeEnum> organizationTypes, List<AllocationStatusEnum> allocationStatuses) {
return organizationsDao.getOrganizations(effectiveDate, organizationTypes, allocationStatuses);
}
DAO 就是这样,
public class OrganizationsDao extends AbstractDao implements IOrganizationsDao {
@Override
public List<IOrganization> getPendingOrganizations(LocalDate effectiveDate) {
// TODO Auto-generated method stub
return null;
}
@Override
public List<IOrganization> getOrganizations(LocalDate effectiveDate, List<OrganizationTypeEnum> organizationTypeEnums,
List<AllocationStatusEnum> allocationStatuses) {
// TODO Auto-generated method stub
return null;
}
【问题讨论】: