0
votes

I have an annotated Junit 4 test using JDK 1.8 running in Eclipse. I'm using Mockito to mock the DAO in the service class under test. The runner in the abstract class extends SpringJUnit4ClassRunner. When I run the test, the unimplemented method in the concrete DAO class is called, instead of the mocked method. I've searched and searched, and can't seem to find a solution. What am I doing wrong?

SOLVED - I changed the @InjectMocks @Autowired IOrganizationsService organizationsService; to remove the interface and autowiring, @InjectMocks OrganizationsService organizationsService; fixed below, and the DAO gets mocked. Now the question, why wasn't the DAO in the declaration using the interface mocked?

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

The service class is this,

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

and the DAO is this,

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;
}
1

1 Answers

0
votes

I think the issue here is that while mocking the method call you are using isA for parameters. As per my understanding, isA method is used for the verification not for passing the parameters. Try any method instead:

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