/*
* 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)