使用Mockito嘲笑枚举?

2022-09-04 08:27:13

我需要模拟以下枚举:

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

我该如何解决这个问题?


答案 1

只是为了完成图片:

最新版本的Mockito 2非常支持对最终类的模拟。但是,您必须首先显式启用此新的实验性功能!

( 请参阅此处了解如何执行此操作 - 归结为将文件添加到类路径中,其中包含值mockito-extensions/org.mockito.plugins.MockMakermock-maker-inline )

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


答案 2

您正在尝试断言 不返回 null。testFindByStatusfindByStatus

如果无论参数的值如何,该方法的工作方式都相同,则只需传递其中一个: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());
    }
}

推荐