2015-04-13 7 views
1

Я всегда думал, что Mockito работает с каким-то прокси-сервером и тому подобным. Но теперь я узнал, что Мокито позволяет мне делать что-то вродеКак работает mocktio spy moker?

class A { 
    public String m1() { 
    return m2(); 
    } 

    public String m2() { 
    return "Hello"; 
    } 
} 

class TestA { 
    public testM1() { 
    A a = Mockito.spy(A.class); 
    when(a.m2()).thenReturn("Bye"); 
    Assert.assertEquals(a.m1(), "Bye"); 
    } 
} 

Это не будет работать с прокси. Как оно работает? Может ли эта техника использоваться для вызова внутренних AOP-методов? (см. Spring AOP not working for method call inside another method)

ответ

2

Mockito действительно работает с прокси-серверами и поддерживает шпионов. Ваш синтаксис немного выключен, хотя:

/* BAD */ A a = Mockito.spy(A.class); 
/* GOOD */ A a = Mockito.spy(new A()); 

Причиной различного поведения является то, что a не делегата параметру в spy(), но вместо этого копирует значения полей в новом сгенерированного подкласса A со всеми его методами, переопределенными. Следовательно, весной ссылки на изнутри A ссылаются на развернутый экземпляр, где в ссылках Mockito на this ссылаются на обернутый объект, включая неявную ссылку на this в вызове m2() в пределах m1.

Хотя похоже, что это позволит использовать АОП, я не могу проверить, что он работает, и полагать, что это будет зависеть от деталей реализации Mockito и Spring AOP (и порядка, в котором обертывание происходит).

[Редакция: Даже если вы можете заставить две системы генерации кода работать вместе, сможете ли вы и ваши коллеги читать или понимать/отлаживать тест через год? :)]

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