如何模拟已注入依赖项的超类

ATE*_*REF 5 java spring-mvc junit4 mockito

我有一个使用 Spring MVC 的项目。我正在尝试为项目架构中的服务模块编写单元测试。所有服务类都从名为“BaseService”的超类扩展。基础服务是这样的:

public abstract class BaseService {

private static final Logger  logger = LoggerFactory.getLogger(BaseService.class);

@Autowired(required = true)
private HttpServletRequest   request;

@Autowired
private ReloadableResourceBundleMessageSource messageSource;

/*
 * Injecting Mapper
 */
@Resource
private Mapper mapper;
...

public <T extends BaseBVO, S extends BaseVO> T voToBvo (S vo, Class<?     extends BaseBVO> bvoClass) {

    if (vo != null)
    {
        return (T) mapper.map(vo , bvoClass);
    }
    else
    {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我在服务模块中有一个使用该方法的方法:

"voToBvo (S vo, Class<?     extends BaseBVO> bvoClass")
Run Code Online (Sandbox Code Playgroud)

像这样:

public List<AdcOptionBVO> findOptionByAyantDroitIdAndProduitId (Long idAyantDroit, String idProduit) {

    ....

        list = listVoToBvo(adcList , AdcOptionBVO.class);
        logger.info("Returning List of ayrp count= {}" , list.size());

    return list;
}
Run Code Online (Sandbox Code Playgroud)

我的测试是这样的:

@RunWith(MockitoJUnitRunner.class)
public class AdcServiceImplTest{

@Mock
private Mapper mapper;

    @Test
public void shouldSuccessFindOptionByAyantDroitIdandProduitId() {
    //Given
    List<AdcVO> adcVOList = new ArrayList<>();
    adcVOList.add(new AdcVO());

    List<AdcOptionBVO> listAdcOptionBVO = new ArrayList<>();
    listAdcOptionBVO.add(new AdcOptionBVO());

    List<BaseBVO> baseBVOs = new ArrayList<>();

    //When
    when(repository
            .finAdcByOptionOrderByRUAndPrio(anyLong(), anyString())).thenReturn(adcVOList);

    when(baseService.listVoToBvo(adcVOList,  AdcOptionBVO.class)).thenReturn(baseBVOs);


    //Then
    assertEquals(adcService
            .findOptionByAyantDroitIdAndProduitId(anyLong(), anyString()).size(), adcVOList.size());

}
}
Run Code Online (Sandbox Code Playgroud)

调用映射器时,我在 BaseService.java 中收到 java.lang.NullPointerException 。

 @Resource
 private Mapper mapper;
Run Code Online (Sandbox Code Playgroud)

映射器为空!

我想模拟该方法:

listVoToBvo(adcList , AdcOptionBVO.class);
Run Code Online (Sandbox Code Playgroud)

请帮忙。

ATE*_*REF 3

解决方案是为带有注入参数的抽象类添加构造函数,在我的例子中(映射器),然后在服务构造函数中的服务调用中,super(mapper);所以在测试中我模拟映射器映射器,然后在中实例化我的类@Before,所以映射器作为 Mock 传递给抽象类,并且不为空。它对我来说工作得很好。我希望是克莱尔