Можно ли смоделировать сервис, который создается в тестируемом классе? - PullRequest
0 голосов
/ 20 сентября 2018

Я хотел бы иметь возможность издеваться над SomeService, однако, поскольку это плагин maven, я не контролирую, как создается этот класс.Мне нужно создать SomeService вручную, потому что я не могу использовать его в конструкторе или в другом месте.В тесте я могу издеваться над SomeService - но он будет заменен новым экземпляром, созданным в методе execute().Можно ли издеваться над этим сервисом иначе, чем с помощью PowerMockito ??

@Mojo(name = "hellomojo")
    public class HelloMojo extends AbstractMojo {    

     private SomeService service;    

     @Override
     public void execute() throws MojoExecutionException {     
        service = createService();
     }

     private SomeService createService() {
           return new SomeService(parameter);
     }
    }

Ответы [ 4 ]

0 голосов
/ 16 октября 2018

Мое окончательное решение этой проблемы заключается в следующем.Прежде всего, я извлек создание службы в отдельный класс, например:

public class ServiceProvider {

    public SomeService createService() {
        return new SomeService();
    }
}

Затем в моем HelloMojo я создал два конструктора, где по умолчанию один использует конструктор, который устанавливает SomeService.Наконец, мой класс HelloMojo выглядит следующим образом:

    @Mojo(name = "hellomojo")
    public class HelloMojo extends AbstractMojo {    

     private SomeService service;  

    public HelloMojo(){
       this(new SomeService())      
    }   

    public HelloMojo(SomeService someService){
       this.service=someService;
    }   

     @Override
     public void execute() throws MojoExecutionException {     
        service.doSomething
     }             
    }

Итак, я только что сделал некоторое внедрение зависимости

0 голосов
/ 20 сентября 2018

Расширьте класс HelloMojo в тесте, переопределите метод execute () и задайте свою реализацию.Используйте этот расширенный класс для тестирования в модульных тестах (я предполагаю, что Junits или что-то в этом роде)

0 голосов
/ 22 сентября 2018

Сделайте createService () защищенным, переопределите это и верните макет в ваш тестовый класс при создании анонимного класса, который расширяет HelloMojo.Таким образом, вы проверяете не исходный класс, а его дочерний, но совершенно очевидно, что дочерний элемент похож на родительский класс, за исключением переопределенного метода, который предназначен.

public HelloMojoTest {    

     private HelloMojo helloMojo = new HelloMojo(){
   @Override
     protected SomeService createService() {
// return new or mocked or whatever instance you want
           return new SomeService();
     }
   }
 }
0 голосов
/ 20 сентября 2018

Моим лучшим предположением было бы сделать приватный пакет методов createService() и создать HelloMojoWrapperForTests, который переопределяет его и всегда возвращает макет.Но это похоже на огромный обходной путь только для тестирования ...

...