java Sping Boot 服务类中非bean对象静态工厂初始化的最佳实践[关闭]

nvbavucw  于 2023-09-29  发布在  Java
关注(0)|答案(3)|浏览(86)

已关闭,此问题为opinion-based。它目前不接受回答。
**想改善这个问题吗?**更新问题,以便editing this post可以用事实和引用来回答。

2天前关闭。
Improve this question
我想重构一个应用程序,其中一些字段使用静态工厂方法初始化。这使得单元测试变得困难,这些字段只能通过单元测试中的反射来设置。下面是一个我想重构的代码示例

@Service
@RequiredArgsConstructor 
public class MyService {
   private final RemoteService remoteService = RemoteServiceFactory.newInstance();

   private final MySecondService secondService;

   .... 

}

正如你所看到的,有一个通过工厂初始化的字段。无法进行自动装配,因为未找到此类型的bean。RemoteService是来自maven依赖项的遗留代码。
我正在寻找一些依赖注入的解决方案,因为如果没有反射,你就不能真正正确地测试我的服务。
在服务类中避免这种初始化的最佳实践是什么?

ggazkfy8

ggazkfy81#

只需像往常一样进行依赖注入,并将RemoteServiceFactory.newInstance()移动到@Bean注解的方法中。问题解决了

@Bean
public RemoveService remoteService() {
  return RemoteServiceFactory.newInstance()
}
@Service
public class MyService {
   private final RemoteService remoteService;
   private final MySecondService secondService;

  public MyService(RemoteService remoteService, MySecondService secondService) {
    this.remoteService = remoteService;
    this.secondService = secondService;
  }
  // Remainder of methods
}

**注意:**我删除了Lombok岛的使用,由于个人喜好不使用它,你当然可以使用@RequiredArgsConstructor,如果你喜欢。

biswetbf

biswetbf2#

第一步:将RemoteService定义为Bean,这样您就可以创建一个Java Config类(用@Configuration注解)来将RemoteService定义为Spring bean。

@Configuration
public class RemoteServiceConfig {

   @Bean
    public RemoteService remoteService() {
    return RemoteServiceFactory.newInstance();
   }
}

第二步:通过构造函数注入RemoteService

@Service
@RequiredArgsConstructor
public class MyService {
   private final RemoteService remoteService;
   private final MySecondService secondService;
}

第三步:单元测试,你可以使用Mockito这样的mocking框架来模拟RemoteService和MySecondService。

@RunWith(SpringRunner.class)
public class MyServiceTest {

@Mock
private RemoteService remoteService;

@Mock
private MySecondService secondService;

private MyService myService;

@Before
public void setUp() {
    MockitoAnnotations.openMocks(this);
    myService = new MyService(remoteService, secondService);
}

// ... Your test methods

}

euoag5mw

euoag5mw3#

谢谢你以前的回答。
最后我得到了一个配置,它从第三方库生成RemoteService的bean定义。

@Configuration
public RemoteServiceConfig {
    @Bean
    public RemoteService remoteService() {
        return RemoteServiceFactory.newInstance();
    }
}

我不能自动接线。

相关问题