【问题标题】:Spring 4, Mockito 2, Junit 4 in Eclipse Oxygen - DAO not mockedEclipse Oxygen 中的 Spring 4、Mockito 2、Junit 4 - DAO 未模拟
【发布时间】: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;
}

【问题讨论】:

    标签: eclipse junit mockito


    【解决方案1】:

    我认为这里的问题是,在模拟方法调用时,您使用 isA 作为参数。据我了解, isA 方法用于验证而不是传递参数。尝试任何方法:

    Mockito.when(organizationsDao.getOrganizations(any(LocalDate.class), any(List.class), any(List.class))).thenReturn(organizations);
    

    【讨论】:

    • 显然,@InjectMocks 需要一个具体的类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 2012-10-19
    • 2019-07-01
    • 2020-04-23
    • 1970-01-01
    相关资源
    最近更新 更多