Jul 17, 2019 09:09
@defaultlocale, не-а. Всё равно не получилось. Интересен тот факт, что, почему-то, у меня 1 из Boolean полей, раньше перезаписывалось при повторном вызове. По умолчанию они все false, но при повторном вызове 1 поле становилось true. Не знаю как, но применив ваш подход, у меня все поля false по логике, как и должно быть.
Jul 17, 2019 09:09
@defaultlocale, чяднт? Что я делаю не так?) Завтра смогу проверить и этот вариант. Но, пока что, надеюсь,что это успешный вариант для моей ситуации.
Jul 17, 2019 09:09
@defaultlocale, Готово. Примерно так можно смодулировать возврат null. Классы отдаленно даже не напоминают мой, но проблема воспроизводится
Jul 17, 2019 09:09
Да, только что попробовал, и на англоязычном сайте тоже самое советовали, не то. Всё равно, при втором вызове null
Jul 17, 2019 09:09
@defaultlocale, а, наверное, так и не получится. Я скорее всего понял как сделать. Нужно сделать set/get внутри service класса, после этого делать как-то так DataJpa jpa=get(); get(){return daoService.selectObject(serialNumber);} if(jpa==null){//} set(DataJpa jpa){this.jpa=jpa;} И из теста уже передавать в мой мокнутый класс этот объект. Это ж получается, что я в рамках теста получаю свой объект и он у меня вернется в тест заполненным, если мне нужно, а внутрь service я его никак не передам.... вот это вот кстати и грустно, как тогда проверить. Или всё таки я что-то не так понял?
Jul 17, 2019 09:09
Нет, не правильно. Когда переменная registerFirstResponse заполняется, то я через метод createJpa внутри тестового класса заполняю myObject. По факту, внутри service класса, моя переменная заполнилась корректно, просто там итоговый метод, который ее заполняет ее, он void поэтому ничего не вернет. Но response возвращается в любом случае. В итоге, мне нужно, чтобы заполнился myObject и вызвав этот метод service.registerDevice второй раз, нужно, чтобы моя переменная myObject передала не null, а что-то внутри себя, как будто, это возврат из DAO, а возвращается null
Jul 17, 2019 09:09
Суть в том, что в момент повторного вызова, получается что создается новый объект myObject внутри service вот тут DataJpa jpa=daoService.selectObject(serialNumber); А я хочу, чтобы при первом вызове эта строка вернула null, а потом возвращала myObject
Jul 17, 2019 09:09
Нет, не правильно.
 
Jul 17, 2019 07:10
имею в виду тут, в чате
Jul 17, 2019 07:09
чтобы стереть тестовый класс?
Jul 17, 2019 07:09
а как затереть комменты? )
Jul 17, 2019 07:09
    when(вaoService.selectJpa(serialNumber)).then((Answer<DataJpa>) w -> jpa);
Jul 17, 2019 07:08
Спасибо
Jul 17, 2019 07:07
Получается, разницы между then() и thenAnser никакой нет?
Jul 17, 2019 07:04
ага, то что надо)
Jul 17, 2019 07:01
и еще список этих объектов
Jul 17, 2019 07:01
DataJpa это тот самый пресловутый объект, который нужно тестировать
Jul 17, 2019 07:01
либо, как-то еще можно "повертеть" с when
Jul 17, 2019 07:00
я уже утром сегодня попробовал... не помогло(
Jul 17, 2019 06:59
но менять класс ради теста..... не наш подход )
Jul 17, 2019 06:59
я думал вынести это "статическое" место из тестируемого класса в отдельный метод, где будет использоваться только вызов этого метода, чтобы его замокать
Jul 17, 2019 06:57
он из нескольких объектов создает тот самый jpa
Jul 17, 2019 06:57
Да, это реальный статический метод
Jul 17, 2019 06:57
блин) я не могу удалить отсюда этот тест xD
Jul 17, 2019 06:51
public class ApplePayRestServiceTest {

private UserDaoService userDaoService = mock(UserDaoService.class);
private SettingsService settingsService = mock(SettingsService.class);
private CardOSGIService cardOSGIService = mock(CardOSGIService.class);
private DaoService daoService = mock(DaoService.class);
private IAllServices siebelService = mock(IAllServices.class);

private Request request = spy(Request.class);
private HttpServletRequest httpServletRequest = spy(HttpServletRequest.class);

private RestServiceImpl service = spy(RestServiceImpl.class);
Jul 17, 2019 06:51
Как-то так, но он еще не написан полностью, в связи с загвоздкой в самом начале)
Jul 17, 2019 06:43
минуту
Jul 17, 2019 06:43
Теста?
Jul 17, 2019 06:42
)
Jul 17, 2019 06:42
ну да, только вместо 1 when у меня из по 4 будет, потому что у меня там несколько объектов проверяется....
Jul 17, 2019 06:41
В общем, можете оформлять ответ) Дальше, уже мой головняк и другая проблема. Главное, эту решили, и за это спасибо
Jul 17, 2019 06:41
Мой setter делается в рамках @BeforeClass. Так как все реальные сеттеры замоканы. Там используется куча классов. А самая главная проблема это то, что нельзя замокать public static void method(){}
Jul 17, 2019 06:40
В итоге, 8 раз нужно проставлять when.doReturn
Jul 17, 2019 06:39
У меня тест сначала создает объект, потом попытка его создать еще раз ( то есть тут проверка, которую мы делаем, есть ли объект или нет)
Потом объект изменяется ( и нужно сделать проверку еще раз, что объект изменен и он уже не равен старому объекту )
потом еще раз обновляем объект ( и снова проверка)
Потом удаляем объект ( и снова проверка )...
Jul 17, 2019 06:35
в итоге, в @Before нужно только определить константы, а все изменяемые объекты я объявлять должен совместно со всеми when после каждых изменений этих объектов
Jul 17, 2019 06:34
Т_Т
Jul 17, 2019 06:29
@defaultlocale А сеттер где должен быть? в моём нормальном классе? Ппросто, по факту, у меня там около 20 полей и добавлять 20 строк кода в тест, для переопределения полей, мне кажется очень громоздко, проще писать when().doReturn()... Или я не прав в данной ситуации?
Jul 17, 2019 06:27
В итоге
Jul 17, 2019 06:24
не, немного не на то у меня акцент был. Направлен на то, что, если переменная class1 будет меняться в течение всего теста, то каждый раз придется делать
when().doReturn(class1) перед той ситуацией, когда class1 изменился и мне нужно это новое, измененное значение
Jul 17, 2019 06:21
@defaultlocale Ну, это здесь, не используется, у меня то в тесте, он еще тьму раз будет использоваться, собственно, по этой причине я и задавал вопрос)
Jul 17, 2019 06:21
только странно, почему, видимо mock заполняет сразу все свои thenReturn еще до вызова (when) текущими значениями переданных переменных и, в итоге, так как class1==null, то thenReturn(null).thenReturn(class1) почти идентичноthenReturn(null).thenReturn(null) для моей ситуации
Jul 17, 2019 06:19
да, исправил
Jul 17, 2019 06:18
Вот так, действительно сработало

Class1 class1 = null;
Class2 class2 = spy(Class2.class);
when(class2.getMyObjectFromMethod()).thenReturn(null);

Response responseFirstClass1 = class2.testClass();
class1 = fulfilClass();

when(class2.getMyObjectFromMethod()).thenReturn(class1);

Response responseSecondClass1 = class2.testClass();
Jul 17, 2019 06:18
Сейчас пытаюсь перенести на "реальный" тест)
Jul 17, 2019 06:17
Да, получается на тестовом тесте)
Jul 17, 2019 06:12
ну , это не проблема, да, если тест проходит, пускай заходит. Просто интересно почему так делается....
Jul 17, 2019 06:11
о... минутку
Jul 17, 2019 06:09
Вот, собственно, а потом
Когда выполняется

Response responseFirstClass1 = class2.testClass();

то у меня внутри testClass() срабатывает проверка

if (class1 == null) {
class1 = getMyObjectFromMethod(); // это сразу мокается и возвращается ull
Jul 17, 2019 06:07
То есть, он лезет в
public Class1 getMyObjectFromMethod() {
Class1 class1 = new Class1("field1", "field2", "field3");
return class1;
}

и инициализирует эти все поля, возвращает class1 заполненный, но потом, выполняется thenReturn(null) и я получаю class1=null; Разве не должна быть какая-то.... "мокнутость" сразу этого getMyObjectFromMethod метода и в него не заходить?