2013-05-16 3 views
2

У меня есть следующая структураЯвляется ли 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 заменили его на новый?

ответ

2

B экземпляра будет построен, прежде чем шпионили, поэтому ссылка, что C принимает является объектом фактическогоB и не Шпионивший экземпляр.

Вы добавляете поведение к экземпляру spied, который действительно представляет собой другой объект, который имеет значение C.bObject, поэтому поведение не применяется. Аналогично установка b.otherValue не будет установлена ​​на b.cObject.bObject.otherValue.

Вы можете видеть, что это разные объекты - предполагающие по умолчанию toString присутствует:

final B b = Mockito.spy(new B()); 

System.out.println("spied: " + b); 
System.out.println("b.cObject.bObject: " + b.cObject.bObject); 

Она должна производить что-то вдоль линий:

spied: [email protected] 
b.cObject.bObject: [email protected] 

Может быть, вы могли бы использовать отражение для установки b.cObject.bObject Поле для справки? Например:

final Field f = C.class.getDeclaredField("bObject"); 
f.setAccessible(true); 
f.set(b.cObject, b); 
+0

inpied: B $$ EnhancerByMockitoWithCGLIB $$ 999ce15d @ 7a187814 'вот в чем смысл. Я видел это в разделе часов Eclipse. Есть ли какая-нибудь работа для этой ситуации? – iberbeu

+0

К сожалению, я не совсем уверен, что предложить - обычно я бы сказал, что пропустил объект шпионажа, но в этом случае это не так просто. Разве нет возможности нарушить циркулярную ссылку? – Jonathan

+0

на самом деле нет способа сломать его, потому что это устаревший код, поэтому мне просто нужен способ его обработать. И я не могу передать обманутый объект после его создания, потому что для него нет метода «set» ... – iberbeu

Смежные вопросы