代码之家  ›  专栏  ›  技术社区  ›  Artur Skrzydło

是否可以模拟在被测类中创建的服务?

  •  2
  • Artur Skrzydło  · 技术社区  · 6 年前

    我希望能够模仿SomeService,但是,因为它是一个maven插件,我无法控制这个类是如何创建的。我需要手动创建一些服务,因为我不能在构造函数或其他地方使用它。在测试中,我可以模拟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 回复  |  直到 6 年前
        1
  •  1
  •   Tomasz Bawor    6 年前

    我最好的猜测是 createService() HelloMojoWrapperForTests 它覆盖它并总是返回mock。但这似乎是一个巨大的解决方案只是为了测试。。。

        2
  •  1
  •   Satish    6 年前

    将createService()设为protected并重写它,并在创建扩展HelloMojo的匿名类时返回测试类中的mock。这样,虽然您不是测试原始类而是测试它的子类,但很明显,子类与父类一样,只是要测试的重写方法不同。

    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
  •   satishkk    6 年前

    在test中扩展HelloMojo类,重写execute()方法并给出实现。使用这个扩展类在单元测试中进行测试(我假设是Junits之类的)

        4
  •  0
  •   Artur Skrzydło    6 年前

    我对这个问题的最终解决办法是如下。首先,我将服务创建提取到单独的类中,如:

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