mock单元测试改为 try-with-resources仍然报错

文章目录


前言

最近对mock单元测试进行了修改,发现将其改为 try-with-resources后跑maven test仍然报错static mocking is already registered in the current thread


解决方案

不多废话直接揭露答案,比如A类为静态类,在多个测试类中出现,被构建为静态mock,且报错的位置都为try块以内,出现这种状况很诡异。答案是有些类没在try块内创建或者没有关闭,且它没有在maven test中报错,只需要在test包内搜索A类,找到所有构建静态Mock的测试类,将其所有都改为在try块内即可。

/* * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. */ package com.huawei.gts.testcaseapi.service; import com.huawei.adcmate.sdk.project.utils.UnifyDevUserAccessCheckUtil; import com.huawei.gts.adcmate.pipeline.sdk.common.utils.FileCheckUtil; import com.huawei.gts.testcaseapi.bean.entity.Action; import com.huawei.gts.testcaseapi.bean.entity.TestCase; import com.huawei.gts.testcaseapi.bean.vo.CaseFilterVo; import com.huawei.gts.testcaseapi.bean.vo.QueryTestCaseResult; import com.huawei.gts.testcaseapi.bean.vo.TestCaseStepDto; import com.huawei.gts.testcaseapi.bean.vo.TestCaseVo; import com.huawei.gts.testcaseapi.bean.vo.VerificationPoint; import com.huawei.gts.testcaseapi.dao.TestCaseDao; import com.huawei.gts.testcaseapi.service.impl.TestCaseServiceImpl; import com.huawei.gts.testcaseapi.util.FileUtil; import com.huawei.gts.testcaseapi.util.UploadFileUtil; import com.huawei.gts.testcaseapi.util.XmlUtil; import com.huawei.mateinfo.sdk.file.FileServiceManager; import com.huawei.mateinfo.sdk.file.service.FileService; import com.huawei.mateinfo.sdk.security.file.util.ZipUtils; import com.huawei.security.upload.CommonsMultipartFile; import com.huawei.us.common.xml.UsXmlUtils; import com.huawei.us.kms.sdk.KmsSdkTool; import org.apache.commons.fileupload2.core.FileUploadException; import org.dom4j.io.SAXReader; import org.junit.Assert; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import static org.junit.Assert.assertEquals; /** * 测试用例TestCaseService测试类 * * @since 2021-10-30 */ public class TestCaseServiceTest { @Mock private TestCaseDao testCaseDao; private TestCaseService testCaseService; private String xml; private TestCase testCase; /** * 预处理 * * @throws IOException FileUtil抛出异常 */ @BeforeEach public void init() throws IOException { testCaseDao = Mockito.mock(TestCaseDao.class); testCaseService = new TestCaseServiceImpl(testCaseDao); Mockito.mockStatic(UnifyDevUserAccessCheckUtil.class); Mockito.mockStatic(UsXmlUtils.class); Mockito.when(UsXmlUtils.getSecurityXmlTool(SAXReader.class)).thenReturn(new SAXReader()); Mockito.mockStatic(UploadFileUtil.class); xml = FileUtil.readFile("src/test/resources/playbackScript.xml".replaceAll("//", File.separator)); testCase = TestCase.createTestCase("", "AAA", "TEST", xml.getBytes(StandardCharsets.UTF_8), "pub_MateProxy"); } /** * 测试用例描述:测试上传用例的场景 * 预置条件:调用testCaseDao.queryByTenantIdAndProjectNameAndCaseName返回null * 调用testCaseDao.saveAndFlush返回testCase * 操作步骤:调用testCaseService.uploadTestCase * 预期结果:返回testCase * * @throws IOException IOException * @throws FileUploadException FileUploadException */ @Test public void testUploadTestCase() throws IOException, FileUploadException { Mockito.when(testCaseDao.queryByTenantIdAndProjectNameAndCaseName("", "AAA", "TEST")).thenReturn(null); Mockito.when(testCaseDao.saveAndFlush(Mockito.any())).thenReturn(testCase); Mockito.mockStatic(ZipUtils.class); Mockito.mockStatic(FileUtil.class); Mockito.mockStatic(FileCheckUtil.class); Mockito.mockStatic(KmsSdkTool.class); Mockito.when(FileUtil.readFile(Mockito.any())).thenReturn(xml); Mockito.when(KmsSdkTool.encrypt(null, "123")).thenReturn(""); CommonsMultipartFile file = Mockito.mock(CommonsMultipartFile.class); Mockito.when(file.getFilename()).thenReturn("TEST.zip"); Mockito.when(file.getTempFileName()).thenReturn("TEST.zip"); TestCase testCase1 = testCaseService.uploadTestCase("AAA", "TEST", file); assertEquals(testCase1, testCase); } /** * 测试用例描述:测试获取用例列表的场景 * 预置条件:调用testCaseDao.queryTestCaseList返回包含testCases的list * 操作步骤:调用testCaseService.queryTestCaseList * 预期结果:caseName为TEST */ @Test public void testQueryTestCaseList() { testCase.setCaseId("111"); List<TestCase> testCases = new ArrayList<>(Collections.singletonList(testCase)); Mockito.when(testCaseDao.queryTestCaseList(Mockito.anyString(), Mockito.anyString(), Mockito.any())) .thenReturn(testCases); QueryTestCaseResult queryTestCaseResult = testCaseService.queryTestCaseList("AAA", 1, 10, new CaseFilterVo()); assertEquals(queryTestCaseResult.getList().get(0).getCaseName(), "TEST"); } /** * 测试用例描述:测试查询用例步骤的场景 * 预置条件:调用testCaseDao.queryByCaseId返回testCases * 操作步骤:调用testCaseService.queryTestCaseSteps * 预期结果:actions的size为11 */ @Test public void testQueryTestCaseDetail() { Mockito.when(testCaseDao.queryByCaseId(Mockito.anyString())).thenReturn(testCase); FileService fileService = Mockito.mock(FileService.class); Mockito.mockStatic(FileServiceManager.class); Mockito.when(FileServiceManager.getShardFileService()).thenReturn(fileService); Mockito.when(fileService.getFileStream(Mockito.any())).thenThrow(new RuntimeException()); List<Action> actions = testCaseService.queryTestCaseSteps("123"); assertEquals(actions.size(), 11); } /** * 测试用例描述:测试删除用例步骤的场景 * 预置条件:调用testCaseDao.findAllByCaseIdIn返回包含testCases的集合 * 操作步骤:调用testCaseService.deleteTestCase * 预期结果:调用到testCaseDao.findAllByCaseIdIn */ @Test public void testDeleteTestCase() { Mockito.when(testCaseDao.findAllByCaseIdIn(Mockito.any())).thenReturn(Collections.singletonList(testCase)); FileService fileService = Mockito.mock(FileService.class); Mockito.mockStatic(FileServiceManager.class); Mockito.when(FileServiceManager.getShardFileService()).thenReturn(fileService); TestCaseVo testCaseVo = new TestCaseVo(); testCaseVo.setCaseId("123"); testCaseService.deleteTestCase(Collections.singletonList(testCaseVo)); Mockito.verify(testCaseDao).findAllByCaseIdIn(Mockito.any()); } /** * 测试用例描述:测试修改用例步骤 * 预置条件:调用testCaseDao.queryByCaseId返回testCases * 调用testCaseDao.updateXmlScriptByCaseId do nothing * 操作步骤:调用testCaseService.updateTestCase * 预期结果:调用到testCaseDao.updateXmlScriptByCaseId */ @Test public void testUpdateTestCase() { Mockito.when(testCaseDao.queryByCaseId(Mockito.any())).thenReturn(testCase); Mockito.doNothing().when(testCaseDao).updateXmlScriptByCaseId(Mockito.anyString(), Mockito.any()); TestCaseStepDto testCaseStepDto = new TestCaseStepDto(); testCaseStepDto.setStepId("973be0b2-dc1d-40be-bdd3-dbd66cb2fd6c"); testCaseStepDto.setDelete(false); testCaseStepDto.setStepName("asdf"); testCaseStepDto.setStepValue("bcsd"); testCaseStepDto.setEncrypt(false); TestCaseStepDto testCaseStepDto1 = new TestCaseStepDto(); testCaseStepDto1.setStepId("5feb9f2f-7020-42e5-9f1d-398b86dc77ce"); testCaseStepDto1.setDelete(true); testCaseService.updateTestCase("11", Arrays.asList(testCaseStepDto1, testCaseStepDto)); Mockito.verify(testCaseDao).updateXmlScriptByCaseId(Mockito.anyString(), Mockito.any()); } /** * 测试用例描述:测试修改用例名称 * 预置条件:调用testCaseDao.queryByCaseId返回testCases * 调用testCaseDao.updateCaseName do nothing * 操作步骤:调用testCaseService.updateCaseNameAndEnvInfo * 预期结果:调用到testCaseDao.updateCaseName */ @Test public void testUpdateCaseNameAndEnvInfo() { Mockito.when(testCaseDao.queryByCaseId(Mockito.any())).thenReturn(testCase); Mockito.doNothing().when(testCaseDao).updateCaseName(Mockito.anyString(), Mockito.anyString()); testCaseService.updateCaseNameAndEnvInfo("11", "abc"); Mockito.verify(testCaseDao).updateCaseName(Mockito.anyString(), Mockito.anyString()); } /** * 设置验证点 * * @return 验证点 */ private VerificationPoint getVerificationPoint() { VerificationPoint verificationPoint = new VerificationPoint(); verificationPoint.setValidationStepId("5eebb949-c16f-40c2-b567-7c23da4b87ed"); verificationPoint.setValidationStepName("click"); verificationPoint.setOperation("in"); verificationPoint.setName("验证点"); verificationPoint.setValue("abc"); return verificationPoint; } /** * 测试用例描述:测试增加验证点 * 预置条件:调用testCaseDao.queryByCaseId返回testCases * 调用testCaseDao.updateXmlScriptByCaseId do nothing * 操作步骤:调用testCaseService.addVerification * 预期结果:调用到testCaseDao.updateXmlScriptByCaseId */ @Test public void testAddVerification() { Mockito.when(testCaseDao.queryByCaseId(Mockito.any())).thenReturn(testCase); Mockito.doNothing().when(testCaseDao).updateXmlScriptByCaseId(Mockito.anyString(), Mockito.any()); testCaseService.addVerification("11", getVerificationPoint()); Mockito.verify(testCaseDao).updateXmlScriptByCaseId(Mockito.anyString(), Mockito.any()); } /** * 测试用例描述:测试修改验证点 * 预置条件:调用testCaseDao.queryByCaseId返回testCases * 调用testCaseDao.updateXmlScriptByCaseId do nothing * 操作步骤:调用testCaseService.updateVerification * 预期结果:调用到testCaseDao.updateXmlScriptByCaseId */ @Test public void testUpdateVerification() { Mockito.when(testCaseDao.queryByCaseId(Mockito.any())).thenReturn(testCase); Mockito.doNothing().when(testCaseDao).updateXmlScriptByCaseId(Mockito.anyString(), Mockito.any()); VerificationPoint verificationPoint = getVerificationPoint(); verificationPoint.setId("abc"); testCaseService.updateVerification("11", verificationPoint); Mockito.verify(testCaseDao).updateXmlScriptByCaseId(Mockito.anyString(), Mockito.any()); } /** * 测试用例描述:测试删除验证点 * 预置条件:调用testCaseDao.queryByCaseId返回testCases * 操作步骤:调用testCaseService.deleteVerification * 预期结果:调用到testCaseDao.updateXmlScriptByCaseId */ @Test public void testDeleteVerification() { Mockito.when(testCaseDao.queryByCaseId(Mockito.any())).thenReturn(testCase); testCaseService.deleteVerification("11", "abc"); Mockito.verify(testCaseDao).updateXmlScriptByCaseId(Mockito.anyString(), Mockito.any()); } /** * 测试用例描述:测试检验xml脚本方法 * 预置条件:调用KmsSdkTool.encrypt加密123返回no * 校验的xml通过xml文件设置 * 操作步骤:调用TestCaseServiceImpl.checkXmlScript * 预期结果:加密后的xml符合要求 * * @throws IOException IOException */ @Test public void testCheckXml() throws IOException { TestCaseServiceImpl testCaseServiceImpl = new TestCaseServiceImpl(testCaseDao); Mockito.mockStatic(KmsSdkTool.class); Mockito.when(KmsSdkTool.encrypt(null, "123")).thenReturn("no"); String xmlNew = testCaseServiceImpl.checkXmlScript(xml); XmlUtil.parseXmlString(xmlNew); String xmlExpect = FileUtil.readFile("src/test/resources/playbackScriptEncrypt.xml".replaceAll("//", File.separator)); xmlExpect = xmlExpect.replaceAll("\r", ""); assertEquals(xmlExpect, xmlNew); } } 报错------------------------------------------------------------------------------- Test set: com.huawei.gts.testcaseapi.service.TestCaseServiceTest ------------------------------------------------------------------------------- Tests run: 10, Failures: 0, Errors: 10, Skipped: 0, Time elapsed: 0.168 s <<< FAILURE! -- in com.huawei.gts.testcaseapi.service.TestCaseServiceTest com.huawei.gts.testcaseapi.service.TestCaseServiceTest.testCheckXml -- Time elapsed: 0.142 s <<< ERROR! org.mockito.exceptions.base.MockitoException: For com.huawei.adcmate.sdk.project.utils.UnifyDevUserAccessCheckUtil, static mocking is already registered in the current thread To create a new mock, the existing static mock registration must be deregistered at com.huawei.gts.testcaseapi.service.TestCaseServiceTest.init(TestCaseServiceTest.java:71) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) com.huawei.gts.testcaseapi.service.TestCaseServiceTest.testUpdateTestCase -- Time elapsed: 0.001 s <<< ERROR! org.mockito.exceptions.base.MockitoException: For com.huawei.adcmate.sdk.project.utils.UnifyDevUserAccessCheckUtil, static mocking is already registered in the current thread To create a new mock, the existing static mock registration must be deregistered at com.huawei.gts.testcaseapi.service.TestCaseServiceTest.init(TestCaseServiceTest.java:71) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) com.huawei.gts.testcaseapi.service.TestCaseServiceTest.testDeleteVerification -- Time elapsed: 0.001 s <<< ERROR! org.mockito.exceptions.base.MockitoException: For com.huawei.adcmate.sdk.project.utils.UnifyDevUserAccessCheckUtil, static mocking is already registered in the current thread To create a new mock, the existing static mock registration must be deregistered at com.huawei.gts.testcaseapi.service.TestCaseServiceTest.init(TestCaseServiceTest.java:71) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) com.huawei.gts.testcaseapi.service.TestCaseServiceTest.testDeleteTestCase -- Time elapsed: 0.002 s <<< ERROR! org.mockito.exceptions.base.MockitoException: For com.huawei.adcmate.sdk.project.utils.UnifyDevUserAccessCheckUtil, static mocking is already registered in the current thread To create a new mock, the existing static mock registration must be deregistered at com.huawei.gts.testcaseapi.service.TestCaseServiceTest.init(TestCaseServiceTest.java:71) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) com.huawei.gts.testcaseapi.service.TestCaseServiceTest.testUpdateVerification -- Time elapsed: 0.001 s <<< ERROR! org.mockito.exceptions.base.MockitoException: For com.huawei.adcmate.sdk.project.utils.UnifyDevUserAccessCheckUtil, static mocking is already registered in the current thread To create a new mock, the existing static mock registration must be deregistered at com.huawei.gts.testcaseapi.service.TestCaseServiceTest.init(TestCaseServiceTest.java:71) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) com.huawei.gts.testcaseapi.service.TestCaseServiceTest.testAddVerification -- Time elapsed: 0.002 s <<< ERROR! org.mockito.exceptions.base.MockitoException: For com.huawei.adcmate.sdk.project.utils.UnifyDevUserAccessCheckUtil, static mocking is already registered in the current thread To create a new mock, the existing static mock registration must be deregistered at com.huawei.gts.testcaseapi.service.TestCaseServiceTest.init(TestCaseServiceTest.java:71) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) com.huawei.gts.testcaseapi.service.TestCaseServiceTest.testQueryTestCaseList -- Time elapsed: 0.001 s <<< ERROR! org.mockito.exceptions.base.MockitoException: For com.huawei.adcmate.sdk.project.utils.UnifyDevUserAccessCheckUtil, static mocking is already registered in the current thread To create a new mock, the existing static mock registration must be deregistered at com.huawei.gts.testcaseapi.service.TestCaseServiceTest.init(TestCaseServiceTest.java:71) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) com.huawei.gts.testcaseapi.service.TestCaseServiceTest.testQueryTestCaseDetail -- Time elapsed: 0.001 s <<< ERROR! org.mockito.exceptions.base.MockitoException: For com.huawei.adcmate.sdk.project.utils.UnifyDevUserAccessCheckUtil, static mocking is already registered in the current thread To create a new mock, the existing static mock registration must be deregistered at com.huawei.gts.testcaseapi.service.TestCaseServiceTest.init(TestCaseServiceTest.java:71) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) com.huawei.gts.testcaseapi.service.TestCaseServiceTest.testUploadTestCase -- Time elapsed: 0.001 s <<< ERROR! org.mockito.exceptions.base.MockitoException: For com.huawei.adcmate.sdk.project.utils.UnifyDevUserAccessCheckUtil, static mocking is already registered in the current thread To create a new mock, the existing static mock registration must be deregistered at com.huawei.gts.testcaseapi.service.TestCaseServiceTest.init(TestCaseServiceTest.java:71) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) com.huawei.gts.testcaseapi.service.TestCaseServiceTest.testUpdateCaseNameAndEnvInfo -- Time elapsed: 0.001 s <<< ERROR! org.mockito.exceptions.base.MockitoException: For com.huawei.adcmate.sdk.project.utils.UnifyDevUserAccessCheckUtil, static mocking is already registered in the current thread To create a new mock, the existing static mock registration must be deregistered at com.huawei.gts.testcaseapi.service.TestCaseServiceTest.init(TestCaseServiceTest.java:71) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
11-06
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值