但是,我希望能够模拟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);
}
}
答案 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
}
}
所以,我刚刚做了一些依赖注入