У меня есть следующая структураЯвляется ли mockito меняющим объекты?
public class A{...}
public class B extends A{
private C cObject;
private Object otherValue;
B(){
cObject = new C(this);
}
}
public class C{
private B bObject;
C(B bObject){
this.bObject = bObject;
}
}
Я хочу проверить метод класса B. Я использую Mockito, потому что мне нужно издеваться другой метод B, чтобы проверить метод, который я хочу, чтобы проверить. Поэтому в своем тесте я объявляю объект B как @Spy
, затем я вызываю MockitoAnnotations.initMocks(this);
и, наконец, я издеваюсь над методом, используя doReturn().when().method();
Теперь я запускаю тест, и он терпит неудачу. Мое удивление возникает, когда я его отлаживаю, и я понимаю, что когда я нахожусь в объекте B, значение поля otherValue
есть, например, X
, но когда я нахожусь в C, значение this.bObject.otherValue
не равно X
, но null
.
Поскольку я создал объект C внутри B с new C(this);
, не должны ли оба B и C.bObject быть одним и тем же объектом и содержать поэтому одинаковые значения?
ПРИМЕЧАНИЕ: Я также попробовал без шпионит объект и насмехаясь метод, и он работает, так что реальный вопрос:
ли Mockito заменить мой объект с другим объектом, когда я шпионить его? И в этом случае, что я могу сделать, чтобы он работал?
EDIT может быть проще: я хочу протестировать объект B, этот объект B создает экземпляр объекта C, передающего себя (это) в качестве параметра. Мне нужно шпионить объект B, чтобы я создал в своем тесте экземпляр B, а затем позвонил MockitoAnnotations.initMocks(this);
. Оба объекта (один в тесте и один в экземпляре C) после этого вызова все тот же объект или mockito заменили его на новый?
inpied: B $$ EnhancerByMockitoWithCGLIB $$ 999ce15d @ 7a187814 'вот в чем смысл. Я видел это в разделе часов Eclipse. Есть ли какая-нибудь работа для этой ситуации? – iberbeu
К сожалению, я не совсем уверен, что предложить - обычно я бы сказал, что пропустил объект шпионажа, но в этом случае это не так просто. Разве нет возможности нарушить циркулярную ссылку? – Jonathan
на самом деле нет способа сломать его, потому что это устаревший код, поэтому мне просто нужен способ его обработать. И я не могу передать обманутый объект после его создания, потому что для него нет метода «set» ... – iberbeu