避免在不同的调用中重复向映射添加值的方法

问题描述 投票:0回答:1

我有一个有方法的服务类:

@Service
class MService {
private Map<String,String> map=new HashMap<>();
public List<File> genMetFiles(String ver){
.
.
.
  buildMap(ver);
.
.
}  

buildMap 函数进行一些 API 调用并填充地图变量。

最近遇到一个问题:
我做了一个测试课

class MServiceTest {
@Autowired
private MService service;
@ParameterizedTest
@MethodSource(...)
void testM(String ver) {
List<File> mFiles=service.geMetFiles(ver);

}
}

方法源有多个参数。因此,每次调用 testM 方法时,它都会调用 service.genMetFiles 函数,该函数会调用填充映射变量的 buildMap。由于将有多个调用,因此需要用额外的值填充映射变量。它将保存之前生成的所有值。
我在调试时发现了这个问题。
我想知道我是否可以以某种方式编码,这样这个问题就不会发生。

我的想法:

  • 一种方法可能是我可以在方法上编写一个 @pre 条件,并且在方法内部,第一行可能是初始化程序行 -> new HashMap<> 而不是在顶级类级别实例化它。
  • 现在有多个 Junit 测试。我可以这样做,以便每次调用测试时都会创建一个新的服务实例。我可以通过删除 @Autowired 注释并使用 @BeforeEach 注释 init() 方法来实现此目的。但不确定如何在该方法中初始化 MService,因为 MService 类具有 @Autowired 变量。

对以上两种方法有什么建议或想法,或者还有其他想法吗?


从不同的方向重新表述问题:

@Service
class MService {
private Map<String,String> map=new HashMap<>();
public List<File> genMetFiles(String ver){
.
.
.
  buildMap(ver);
.
.
}  

现在,如果其他类具有此 Mservice 类的 Autowired 变量,则称为 mService。
现在,如果我调用 mService.buildMap("1.2.0") 地图将填充一些值,之后如果我调用 mService.buildMap("1.3.0") 新值将添加到地图或大小地图将会增加。
这不是我想要的。因为如果我调用 mService.someOtherMethod() 行为将会改变。
此方法使用映射变量。其中包含通过调用“1.2.0”和“1.3.0”生成的数据。

java spring-boot refactoring junit5
1个回答
0
投票

就像您提到的,使用

init()
注释的
@BeforeEach
方法会起作用。要初始化服务类中的其他自动装配变量,
MockitoAnnotations.openMocks(this)
将注入所需的模拟变量。这样你的地图应该在运行每个测试方法之前被清除

class MServiceTest {
    @InjectMocks
    MService service;

    @Mock
    Foo foo

    @BeforeEach
    void init() {
        MockitoAnnotations.openMocks(this);
    }

    @ParameterizedTest
    @MethodSource(...)
    void testM(String ver) {
        List<File> mFiles = service.geMetFiles(ver);

    }
}

希望这有帮助

© www.soinside.com 2019 - 2024. All rights reserved.