我有一个有方法的服务类:
@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。由于将有多个调用,因此需要用额外的值填充映射变量。它将保存之前生成的所有值。
我在调试时发现了这个问题。
我想知道我是否可以以某种方式编码,这样这个问题就不会发生。
我的想法:
对以上两种方法有什么建议或想法,或者还有其他想法吗?
从不同的方向重新表述问题:
@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”生成的数据。
就像您提到的,使用
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);
}
}
希望这有帮助