使用 Mockito 模拟枚举?

新手上路,请多包涵

我需要模拟以下枚举:

 public enum PersonStatus
{
    WORKING,
    HOLIDAY,
    SICK
}

这是因为它在我正在测试的以下类中使用:

被测类:

 public interface PersonRepository extends CrudRepository<Person, Integer>
{
    List<Person> findByStatus(PersonStatus personStatus);
}

这是我当前的测试尝试:

当前测试:

 public class PersonRepositoryTest {

    private final Logger LOGGER = LoggerFactory.getLogger(PersonRepositoryTest.class);

    //Mock the PersonRepository class
    @Mock
    private PersonRepository PersonRepository;

    @Mock
    private PersonStatus personStatus;

    @Before
    public void setUp() throws Exception {

        MockitoAnnotations.initMocks(this);
        assertThat(PersonRepository, notNullValue());
        assertThat(PersonStatus, notNullValue());
    }

    @Test
    public void testFindByStatus() throws ParseException {

        List<Person> personlist = PersonRepository.findByStatus(personStatus);
        assertThat(personlist, notNullValue());
    }
}

这给出了以下错误:

错误:

 org.mockito.exceptions.base.MockitoException:
Cannot mock/spy class PersonStatus
Mockito cannot mock/spy following:
  - final classes
  - anonymous classes
  - primitive types

我该如何解决这个问题?

原文由 java123999 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.6k
2 个回答

您的 testFindByStatus 试图断言 findByStatus 不返回空值。

如果无论 personStatus 参数的值如何,该方法都以相同的方式工作,只需传递其中之一:

 @Test
public void testFindByStatus() throws ParseException {
    List<Person> personlist = PersonRepository.findByStatus(WORKING);
    assertThat(personlist, notNullValue());
}

如果其他可能值的行为可能不同,您可以测试每个值:

 @Test
public void testFindByStatus() throws ParseException {
    for (PersonStatus status : PersonStatus.values()) {
        List<Person> personlist = PersonRepository.findByStatus(status);
        assertThat(personlist, notNullValue());
    }
}

原文由 assylias 发布,翻译遵循 CC BY-SA 3.0 许可协议

只是为了完成图片:

最新版本的 Mockito 2 很好地支持模拟最终类。但是您必须首先明确启用这个新的实验性功能!

(有关如何执行此操作的信息,请参见 此处- 归结为将文件 mockito-extensions/org.mockito.plugins.MockMaker 添加到您的类路径中,其中包含值 mock-maker-inline

但当然:只有在必要时才嘲笑某些东西。您模拟 Enum 实例的愿望很可能是因为不理解这一点 - 或者因为您在这里创建了难以测试的代码。从这个意义上说,真正的答案是首先研究避免这种嘲笑的方法。

原文由 GhostCat 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题