[英]Mocking an enum using 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
我該如何解決這個問題?
您的testFindByStatus
試圖斷言findByStatus
不返回null。
如果方法以相同的方式工作,無論personStatus
param的值如何,只需傳遞其中一個:
@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());
}
}
只是為了完成圖片:
最新版本的Mockito 2非常支持模擬最終課程。 但是你必須首先明確啟用這個新的實驗功能!
(請參閱此處了解如何執行此操作 - 歸結為將文件mockito-extensions/org.mockito.plugins.MockMaker
到類路徑中,其中包含值mock-maker-inline
)
但當然:如果必須,你只會嘲笑某事。 你想要模擬Enum實例的願望很可能是由於不了解 - 或者因為你在這里創建了難以測試的代碼。 從這個意義上說,真正的答案是首先考慮避免這種嘲弄的方法。
如前所述,使用 Mockito 2 並啟用實驗性功能。
實際上缺少的是一個示例片段來演示如何。 考慮到一個名為LicenseHistoryAction
的枚舉已經存在 4 個值,這將正確模擬一個UNSUPPORTED
一個:
try (MockedStatic<LicenseHistoryAction> licenseHistoryActionMockedStatic = Mockito.mockStatic(LicenseHistoryAction.class)) {
final LicenseHistoryAction UNSUPPORTED = Mockito.mock(LicenseHistoryAction.class);
Mockito.doReturn(4).when(UNSUPPORTED).ordinal();
licenseHistoryActionMockedStatic.when(LicenseHistoryAction::values)
.thenReturn(new LicenseHistoryAction[]{
LicenseHistoryAction.ASSIGN,
LicenseHistoryAction.RELEASE,
LicenseHistoryAction.UNBIND,
LicenseHistoryAction.DENY,
UNSUPPORTED});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.