Как смоделировать объекты Autowired (Java) и внедрить их внутрь объекта шпиона в Споке - PullRequest
0 голосов
/ 24 июня 2019

Как я могу внедрить фиктивные объекты в шпионский экземпляр в Споке?

Пример:

TestClass

class Service {

     @AutoWired
     private Util util;

     public void testMethod(int a, int b) {

         int c = sum(a,b);
         util.format(c);
     }

     private int sum(int a, int b) {
        ......
     }
}

Спок:

def "testMethod with valid inputs"() {

    given:
       def serviceSpy    = Spy(Service)
       //spy.util          = Mock(Util) I can't do this
       spy.sum(_,_) >> 2

    ......
}

Итак, я сомневаюсь, как я могу внедрить фиктивный объект в шпионский экземпляр?

Я пытался шпионить за существующим экземпляром, но он не заглушает метод, который находится в тестовом классе.

Может ли кто-нибудь подсказать мне, что я могу здесь сделать?Или я могу решить это легко, используя Junit (Mockito)?

1 Ответ

0 голосов
/ 24 июня 2019

Вы можете использовать "constructorArgs"

Вот пример:

def util = Stub(Util) // or whatever
def serviceSpy = Spy(Service, constructorArgs: [util])

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

Вместо этого я предлагаю использовать конструктор зависимости:

class Service {

    private final Util util;

    @Autowired // in recent versions of spring no need to use this annotation
    public Service(Util util) {  
      this.util = util;
    }
}
...