我正在使用Junit5为我的DAO编写单元测试用例。我想测试在达到最大模板时是否抛出BadRequestException
,并检查在找不到模板时是否抛出NotFoundException
。但我得到以下例外:
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:您不能在验证或存根之外使用参数匹配器。
我的代码:
TemplateDao.java
:
@Transactional(readOnly = true)
public MyTemplateDetailsView getTemplateDetails(Long templateId) {
Session session = sessionFactory.getCurrentSession();
MyTemplate myTemplate = getTemplate(templateId);
if (null == myTemplate || myTemplate.getStatus() != TemplateStatus.ACTIVE.value) {
throw new NotFoundException("template.not.found");
}
Integer templatesCount = getTempletsCount(templateId);
if (templatesCount > templateLimit) {
LOGGER.info("max template count reacged");
throw new BadRequestException("template.limit.exceded");
}
}
TemplateDaoTest.java
:
@Test
void getTemplateDetails_ThrowsNotFoundException_IfTemplateNotinActiveStatus() {
Assertions.assertThrows(NotFoundException.class, () -> {
when(templateDao.getTemplate(anyLong())).thenReturn(null);
});
}
@Test
public void getTemplateDetails_ThrowsBadRequestException_IfTemplateLimitExceeded() {
Integer limit = 100;
assertThrows(BadRequestException.class, () -> {
when(templateDao.getTempletsCount(anyLong())).thenReturn(limit);
templateDao.getTemplateDetails(anyLong);
});
}
答案 0 :(得分:0)
我怀疑问题出现在以下代码块中:
assertThrows(BadRequestException.class, () -> {
when(templateDao.getTempletsCount(anyLong())).thenReturn(limit);
templateDao.getTemplateDetails(anyLong);
});
我不确定anyLong
的来源,所以我会假设你的意思是anyLong()
,就像org.mockito.ArgumentMatchers.anyLong
一样。
如果是这样,那么问题在于你试图在存根上下文之外使用Matcher
而不是具体值(即在调用时应该返回什么方法的规范之外)。
当您调用存根方法时,您需要传入正确的Long
,即150L
(或大于templateLimit
的任何内容)。例如:
assertThrows(BadRequestException.class, () -> {
when(templateDao.getTempletsCount(anyLong())).thenReturn(limit);
templateDao.getTemplateDetails(150L); // note the concrete value
});
如果你倾向于这样做,那么重现它实际上是微不足道的(我正在使用JUnit 4,但它也应该适用于JUnit 5):
public class MatchersTest {
@Test
public void testConversion() {
Converter converter = new Converter();
when(converter.from(anyLong())).thenReturn("1");
converter.from(anyLong());
}
private static class Converter {
String from(Long number) {
return String.valueOf(number);
}
}
}