Junit Mockito不抛出异常
我有这个方法我的存储库方法抛出RepositoryException和服务方法抛出service exception我在模拟存储库并抛出repository exception但它没有抛出任何异常任何人能解释一下这里发生了什么吗Junit Mockito不抛出异常,junit,mockito,Junit,Mockito,我有这个方法我的存储库方法抛出RepositoryException和服务方法抛出service exception我在模拟存储库并抛出repository exception但它没有抛出任何异常任何人能解释一下这里发生了什么吗 public class IndActivityTest { static BigDecimal offset; static SecurityContext userContext; SearchFilter filter = new Sear
public class IndActivityTest {
static BigDecimal offset;
static SecurityContext userContext;
SearchFilter filter = new SearchFilter();
SearchFilterToDB filterToDB = new SearchFilterToDB();
static BigDecimal limit;
static User user = null;
@Mock
static UserRepository repository;
@Mock
static SearchRepository searchRepository;
@InjectMocks
static SearchApiServiceImpl searchApiImple;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
}
@BeforeClass
public static void setUp(){
user = new User();
String scheme="https";
userContext = new ServiceSecurityContext(user, scheme);
}
@Test
public void getIndActivitiesPositiveResponse() throws RepositoryException,ServiceException{
List<IndActivityDetailEntity> activityDetailEntities = new ArrayList<>();
when(searchRepository.getIndActivitiesFromDB(filterToDB,user)).thenReturn(activityDetailEntities);
Response response = searchApiImple.getIndActivities(filter, userContext);
assertEquals(response.getStatus(), 200);
}
@Test(expected=ServiceException.class)
public void getIndActivitiesNegetiveResponse() throws RepositoryException,ServiceException{
when(searchRepository.getIndActivitiesFromDB(filterToDB,user)).thenThrow(new RepositoryException());
searchApiImple.getIndActivities(filter, userContext);
}
}
public Response getIndActivities(SearchFilter searchFilter, SecurityContext securityContext)
throws ServiceException {
List<Activity> activities = new ArrayList<>();
try {
logger.info("Entering getActivities");
List<IndActivityDetailEntity> activityDetailEntities = new ArrayList<>();
User user = (User) securityContext.getUserPrincipal();
SearchFilterToDB searchFilterToDB = newFilterToDB(searchFilter, user);
activityDetailEntities = searchRepository.getIndActivitiesFromDB(searchFilterToDB, user);
if (!activityDetailEntities.isEmpty())
activities = SearchUtil.convertIndActivityToIndActivityDTO(activityDetailEntities, searchRepository);
logger.info(" Exiting getActivities");
} catch(Exception e){
handleException(e);
}
return Response.status(200).entity(new InlineResponse200().data(activities)).build();
}
private void handleException(Exception e) throws ServiceException{
logger.error("Service Exception "+e);
if( e instanceof ServiceException)
throw (ServiceException)e;
if( e instanceof RepositoryException ){
RepositoryException re = (RepositoryException)e;
throw new ServiceException(re.getErrorCode(),re,re.getMessage());
}else{
throw new ServiceException(e.getMessage(), e,ServiceConstant.UNKNOWN);
}
}
公共类IndActivityTest{
静态双十进制偏移量;
静态SecurityContext用户上下文;
SearchFilter=newsearchfilter();
SearchFilterToDB filterToDB=新的SearchFilterToDB();
静态大十进制极限;
静态用户=null;
@嘲弄
静态用户存储库;
@嘲弄
静态搜索存储库搜索存储库;
@注射模拟
静态SearchApiServiceImpl searchApiImple;
@以前
公共void init(){
initMocks(this);
}
@课前
公共静态无效设置(){
user=新用户();
字符串scheme=“https”;
userContext=新的ServiceSecurityContext(用户、方案);
}
@试验
public void GetIndActivities PositiveResponse()引发RepositoryException、ServiceException{
List activityDetailEntities=new ArrayList();
当(searchRepository.getIndActivitiesFromDB(filterToDB,user))。然后返回(activityDetailEntities);
Response-Response=searchapimple.getIndActivities(过滤器、用户上下文);
assertEquals(response.getStatus(),200);
}
@测试(预期=ServiceException.class)
public void GetIndActivities NegativeResponse()引发RepositoryException、ServiceException{
当(searchRepository.getIndActivitiesFromDB(filterToDB,user)).thenThrow(new RepositoryException());
searchapimple.getIndActivities(过滤器、用户上下文);
}
}
公共响应getIndActivities(SearchFilter SearchFilter、SecurityContext SecurityContext)
抛出ServiceException{
列表活动=新建ArrayList();
试一试{
logger.info(“输入getActivities”);
List activityDetailEntities=new ArrayList();
User=(User)securityContext.getUserPrincipal();
SearchFilterToDB SearchFilterToDB=newFilterToDB(searchFilter,用户);
activityDetailEntities=searchRepository.getIndActivitiesFromDB(searchFilterToDB,用户);
如果(!activityDetailEntities.isEmpty())
activities=SearchUtil.convertinactivitytoindactivitydto(activityDetailEntities,searchRepository);
logger.info(“退出getActivities”);
}捕获(例外e){
手部异常(e);
}
返回Response.status(200).entity(新的InlineResponse200().data(activities)).build();
}
私有void handleException(异常e)引发ServiceException{
记录器错误(“服务异常”+e);
如果(例如ServiceException实例)
抛出(ServiceException)e;
if(e RepositoryException实例){
RepositoryException re=(RepositoryException)e;
抛出新的ServiceException(re.getErrorCode(),re,re.getMessage());
}否则{
抛出新的ServiceException(e.getMessage(),e,ServiceConstant.UNKNOWN);
}
}
问题在于服务的getIndActivities()
方法中的new FilterToDB(searchFilter,user)
行,因为searchFilterToDB
对象不同,所以方法调用实际上不会被模拟
所以要解决这个问题,,您需要将
new
FilterToDB
对象创建提取到一个单独的类中,并模拟对该类的方法调用。我已经多次使用过这种类型的代码,但仅在这段代码中,我无法引发任何异常。您能在存储库类中发布相关方法并在何处设置模拟吗?我已经编辑了我的questionRepository我无法在此处显示您是否也可以添加服务方法的代码?ServiceException由服务方法引发,因此当存储库引发某些存储库异常时,服务将捕获该异常并引发服务异常。