可以模拟在测试中的类中创建的服务吗?

时间:2018-09-20 08:16:51

标签: java junit mocking mockito maven-plugin

但是,我希望能够模拟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 :(得分:1)

我最好的猜测是将createService()方法包设为私有,并创建HelloMojoWrapperForTests来覆盖它并始终返回模拟。但这只是为了测试而已,这似乎是一个巨大的解决方法...

答案 1 :(得分:0)

在测试中扩展HelloMojo类,并覆盖execute()方法并提供实现。使用此扩展类在单元测试中进行测试(我假设是Junits之类的东西)

答案 2 :(得分:0)

将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();
     }
   }
 }

答案 3 :(得分:0)

下面是我对该问题的最终解决方案。首先,我将服务创建提取到单独的类中,例如:

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
     }             
    }

所以,我刚刚做了一些依赖注入