У меня нет большого опыта работы с Mocking, я недавно начал использовать его в своих тестовых случаях Junit. Однако у меня возникают трудности с пониманием исполнения.Powermockito: java.lang.IllegalArgumentException: несоответствие типа аргумента
Я получаю IllegalArgumentException когда я пытаюсь этот код
PowerMockito.doNothing().when(spyObject, "lockUser", String.class, User.class);
Но когда я обеспечиваю значения, которые lockUser бы ПРИИМИ во время исполнения, все работает, как ожидалось.
Рабочий код
PowerMockito.doNothing().when(spyObject, "lockUser", "my_text", userMock);
Я довольно спутать с этим поведением. Я ожидал такого же поведения. Может ли кто-нибудь объяснить, почему это происходит?
Кроме того, когда у меня есть следующий код
PowerMockito.doNothing().when(spyObject, "lockUser", anyString(), anyObject());
метод больше не высмеивал и реальный метод вызывается.
Интересно, что у меня есть другой метод с тем же именем «lockUser», который принимает различное количество параметров. И в моем другом методе тестирования я использовал только Matchers (anyObject(), anyString() и т. Д.) И работает так, как ожидалось.
PowerMockito.doNothing().when(spyObject, "lockUser", anyObject(), anyString(), anyString(), anyString());
Все методы lockUser являются priavate.
Я работаю с Mockito 1.9.5 вместе с PowerMock 1.5.6
Любая помощь очень ценится
Редактировать Дополнительный код, чтобы понять
Class Core {
public Worker getWorker(String workerId) {
// Get worker from Map<String, Worker> fID_WRK with workerId as key
// Get user from worker (I have mocked this part, so my mock user is
// returned)
If(user.isTooOld()) {
lockUserAndNotify(reason, user);
throw new UserLockedException("Too old");
}
private void lockUserAndNotify(String reason, User user) {
lockUserAndNotify(reason, user.fname, user.lname); // locks user and notifies
}
public getUser(String login, String password) {
// find user in database
if(user password is too old) {
lockUserAndNotify(dbConnection, fname, lname, userId);
}
}
private lockUserAndNotify(Connection dbConn, String fName, String lName, String
userId) {
//method call to lock the user
//method call to notify the admin
}
}
Мой Тест класс
Class CoreTest {
@Test (expected = UserLockedException.class)
public void getUser_ThrowsException() throws
Exception{
Core core = new Core();
Core coreSpy = PowerMockito.spy(core);
when(userMock.isPwdUpdateTimeExpired()).thenReturn(true);
PowerMockito.doNothing().when(coreSpy, "lockUserAndNotify",
anyObject(), anyString(), anyString(), anyString(), anyString());
admin4.UserManager.getUser("l.user1","password");
}
@Test (expected = UserLockedException.class)
public void getWorker_ThrowsException() throws
Exception{
Core core = new Core();
Core coreSpy = PowerMockito.spy(core);
Map workerMap = Whitebox.getInternalState(coreSpy, "fID_WRK");
Map workerMapSpy = PowerMockito.spy(workerMap);
when(workerMapSpy.getWorker("12345")).thenReturn(workerMock);
when(workerMock.getUser()).thenReturn(userMock);
when(userMock.isTooOld()).thenReturn(true);
PowerMockito.doNothing().when(coreSpy, "lockUserAndNotify",
anyString(), anyObject());
admin4.UserManager.getWorker("123445");
}
}
Таким образом, тест getUser_ThrowsEx ception работает так, как ожидалось, но getWorker_ThrowsException этого не делает.
Не могли бы вы выслать код, который хотите проверить? –
Ваш код здесь не компилируется. Сложнее реплицировать и помочь вам. Прочтите http://sscce.org/ – nikhil