JUnit 5:抛出异常抛出失败并显示错误

时间:2018-02-02 10:10:03

标签: unit-testing spring-mvc powermockito junit5

我正在使用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);
    });
}

1 个答案:

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