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)
请帮忙。
解决方案是为带有注入参数的抽象类添加构造函数,在我的例子中(映射器),然后在服务构造函数中的服务调用中,super(mapper);所以在测试中我模拟映射器映射器,然后在中实例化我的类@Before,所以映射器作为 Mock 传递给抽象类,并且不为空。它对我来说工作得很好。我希望是克莱尔
| 归档时间: |
|
| 查看次数: |
11824 次 |
| 最近记录: |