Как смоделировать закрытый метод для разных результатов в потоке кода - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть частный метод в моем коде Java, который должен быть вызван дважды. Я пишу джунты, используя Powermock. При издевательстве над этим методом мне нужны два разных результата для двух разных вызовов.

// Я пробовал:

PowerMockito.doReturn("MyString1").doReturn("MyString2").when(spy,"getresult",Mockito.anyString());

// Но когда () не принимает ничего, кроме шпионского объекта.

PowerMockito.doReturn("MyString1").doReturn("MyString2").when(spy).getresult(Mockito.anyString());

// когда () не разрешает использовать метод getresult, так как этот метод getresult объявлен как private.

CODE

Class A{
String firstString="abc";
String secondString="def";
String result1=getresult(firstString);
String result2=getresult(secondString);

private String getresult(String arg1){
//My code here;
return "AnyString";
}
}

JUNIT

//Declarations
@InjectMocks
A a;
.......
@Test
public void ATest(){
....
/*Suppose I want "MyString1" and "MyString2" as result for calling the method "getresult" for result1 and result2 in Class A*/
A spy=PowerMockito.spy(a);
PowerMockito.doReturn("MyString1").when(spy,"getresult",Mockito.anyString());
....
}
// Please overlook the typos

Я получаю ошибку компиляции при использовании кода, который я пробовал. Как написано в комментариях к коду, я ожидаю двух результатов «MyString1» и «MyString2» в двух последовательных вызовах методов, как показано в коде.

Заранее спасибо. Любой другой подход к достижению результатов приветствуется.

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Позвольте мне начать с примечания, что основная причина использования PowerMock состоит в том, чтобы помочь в тестировании устаревших приложений . Буквально нет места для PowerMock в новом коде. Необходимость PowerMock в новом коде указывает на серьезные проблемы в дизайне.

Одним из преимуществ модульного тестирования является то, что тесты обеспечивают обратную связь с вашим дизайном. Если написание такого теста слишком неудобно, хрупко или невозможно (без PowerMock), вам следует пересмотреть свой дизайн.

Одна из вещей, которую вы можете сделать для тестирования такого кода, - это извлечь приватный метод в отдельный класс и предоставить его в качестве зависимости. Тогда вы можете легко посмеяться над этим. Но вы все равно должны проверить извлеченную логику, которая зависит от того, почему вы не смогли настроить тест в первую очередь. Вам может понадобиться интеграционный тест или другой подход.

0 голосов
/ 01 апреля 2019

Я обычно не тестирую частные методы отдельно.Они будут проверены публичным методом, который вызывает этот закрытый метод.Если имеется несколько потоков, напишите несколько тестов таким образом, чтобы проверялись все пути кода в закрытом методе.

Однако по следующей ссылке показано, как тестировать закрытые методы.

https://dzone.com/articles/mock-private-method

...