Kaynağa Gözat

添加所有mapper的UT,停止任务、获取任务状态、APK解析、APK下载的UT

LiHaoyu 5 yıl önce
ebeveyn
işleme
eb83b84b83

+ 0 - 48
src/test/java/net/mooctest/www/android_auto_test/AndroidAutoTestApplicationTests.java

@@ -1,48 +0,0 @@
-package net.mooctest.www.android_auto_test;
-
-
-import net.mooctest.www.android_auto_test.common.constant.enums.DeviceStatus;
-import net.mooctest.www.android_auto_test.dao.RedisMappers.DeviceStatusMap;
-import net.mooctest.www.android_auto_test.services.DeviceService;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.data.redis.core.StringRedisTemplate;
-
-import java.util.List;
-
-import static org.mockito.Mockito.*;
-
-
-@SpringBootTest
-public class AndroidAutoTestApplicationTests {
-
-	@Mock
-	private StringRedisTemplate redisTemplate;
-
-	@InjectMocks
-	private DeviceStatusMap deviceStatusMap = new DeviceStatusMap();
-
-	@Before
-	public void setUp(){
-		MockitoAnnotations.initMocks(this);
-	}
-
-	@Test
-	public void testLuaScript(){
-		when(redisTemplate.execute(any(), any(List.class), anyString(), anyString()))
-				.thenReturn(1L);
-
-		boolean result = deviceStatusMap.compareAndSet("test", DeviceStatus.RUNNING, DeviceStatus.FREE);
-
-		verify(redisTemplate).execute(any(), any(List.class), anyString(), anyString());
-
-		//junit测试
-		Assert.assertTrue(result);
-	}
-
-}

+ 142 - 0
src/test/java/net/mooctest/www/android_auto_test/ServiceImpl/ApkServiceTest.java

@@ -0,0 +1,142 @@
+package net.mooctest.www.android_auto_test.ServiceImpl;
+
+import com.sinaapp.msdxblog.apkUtil.entity.ApkInfo;
+import com.sinaapp.msdxblog.apkUtil.utils.ApkUtil;
+import net.mooctest.www.android_auto_test.common.exceptions.ApkDownloadException;
+import net.mooctest.www.android_auto_test.common.exceptions.ApkParseException;
+import net.mooctest.www.android_auto_test.services.Impl.ApkServiceImpl;
+import net.mooctest.www.android_auto_test.services.Impl.SecondaryServiceImpl;
+import net.mooctest.www.android_auto_test.utils.AddressUtil;
+import net.mooctest.www.android_auto_test.utils.FileUtil;
+import org.apache.commons.io.FileUtils;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import static org.mockito.Mockito.*;
+
+@SpringBootTest
+@RunWith(PowerMockRunner.class)     // 这是必须的
+@PrepareForTest({ApkServiceImpl.class,
+            FileUtils.class,
+            Thread.class,
+            FileUtil.class})
+public class ApkServiceTest {
+
+    @InjectMocks
+    private ApkServiceImpl apkService = new ApkServiceImpl();
+
+    private ApkInfo apkInfo;
+
+    @Before
+    public void setUp(){
+        MockitoAnnotations.initMocks(this);
+        apkInfo = new ApkInfo();
+        apkInfo.setApplicationIcon("icon");
+        apkInfo.setPackageName("packageName");
+        apkInfo.setSdkVersion("29");
+    }
+
+    @Test
+    public void testParseApk() throws Exception {
+        // arrange
+        ApkUtil apkUtil = PowerMockito.mock(ApkUtil.class);
+        PowerMockito.whenNew(ApkUtil.class).withNoArguments().thenReturn(apkUtil);
+        when(apkUtil.getApkInfo("apkPath")).thenReturn(apkInfo);
+        // action
+        ApkInfo re = apkService.parseAPK("apkPath", "traceId");
+        // assert
+        Assert.assertEquals("packageName", re.getPackageName());
+    }
+
+    @Test
+    public void testParseApkNullPoint() throws Exception {
+        // arrange
+        PowerMockito.whenNew(ApkUtil.class).withNoArguments().thenReturn(null);
+        // action
+        try {
+            ApkInfo re = apkService.parseAPK("apkPath", "traceId");
+        }catch (Exception e){
+            // assert
+            Assert.assertEquals(ApkParseException.class, e.getClass());
+        }
+    }
+
+    @Test
+    public void testParseApkWhenParseWrong() throws Exception {
+        // arrange
+        ApkUtil apkUtil = PowerMockito.mock(ApkUtil.class);
+        PowerMockito.whenNew(ApkUtil.class).withNoArguments().thenReturn(apkUtil);
+        when(apkUtil.getApkInfo("apkPath")).thenThrow(Exception.class);
+        // action
+        try {
+            ApkInfo re = apkService.parseAPK("apkPath", "traceId");
+        }catch (Exception e){
+            // assert
+            Assert.assertEquals(ApkParseException.class, e.getClass());
+        }
+    }
+
+    @Test
+    public void shouldThrowApkDownloadExceptionWhenUseWrongUrl(){
+        // arrange
+        String wrongUrl = "xxxx.xml";
+        // action
+        try {
+            apkService.downloadApk(wrongUrl, "traceId");
+        }catch (Exception e){
+            // assert
+            Assert.assertEquals(ApkDownloadException.class, e.getClass());
+            Assert.assertEquals("Download APK failed because this is not an apk", e.getMessage());
+        }
+    }
+
+    @Test
+    public void shouldThrowApkDownloadExceptionWhenDownloadTenTimes() throws Exception {
+        // arrange
+        String urlStr = "www.aaa.com/bbb/xxxx.apk";
+        PowerMockito.mockStatic(FileUtils.class);
+        PowerMockito.mockStatic(Thread.class);
+        URL url = new URL("http://www.baidu.com");
+        PowerMockito.whenNew(URL.class).withArguments(urlStr).thenReturn(url);
+        PowerMockito.doThrow(new IOException()).when(FileUtils.class);
+        FileUtils.copyURLToFile(any(URL.class), any(File.class));
+        // action
+        try {
+            apkService.downloadApk(urlStr, "traceId");
+        }catch (Exception e){
+            // assert
+            Assert.assertEquals(ApkDownloadException.class, e.getClass());
+            Assert.assertEquals("Download APK failed after tried 10 times.", e.getMessage());
+        }
+    }
+
+    @Test
+    public void shouldReturnPath() throws Exception {
+        // arrange
+        String urlStr = "www.aaa.com/bbb/xxxx.apk";
+        PowerMockito.mockStatic(FileUtils.class);
+        PowerMockito.mockStatic(Thread.class);
+        URL url = new URL("http://www.baidu.com");
+        PowerMockito.whenNew(URL.class).withArguments(urlStr).thenReturn(url);
+        // action
+        String result = apkService.downloadApk(urlStr, "traceId");
+        // assert
+        Assert.assertEquals("tasks/traceId/xxxx.apk", result);
+    }
+}

+ 164 - 0
src/test/java/net/mooctest/www/android_auto_test/ServiceImpl/AutoTestServiceTest.java

@@ -0,0 +1,164 @@
+package net.mooctest.www.android_auto_test.ServiceImpl;
+
+import net.mooctest.www.android_auto_test.common.constant.Consts;
+import net.mooctest.www.android_auto_test.common.constant.enums.DeviceRunningStatus;
+import net.mooctest.www.android_auto_test.common.constant.enums.DeviceStatus;
+import net.mooctest.www.android_auto_test.common.constant.enums.TraceStatus;
+import net.mooctest.www.android_auto_test.common.exceptions.HttpNotFoundException;
+import net.mooctest.www.android_auto_test.services.AutoTestService;
+import net.mooctest.www.android_auto_test.services.Impl.AutoTestServiceImpl;
+import net.mooctest.www.android_auto_test.services.Impl.SecondaryServiceImpl;
+import net.mooctest.www.android_auto_test.services.OssService;
+import net.mooctest.www.android_auto_test.services.TraceService;
+import net.mooctest.www.android_auto_test.utils.AddressUtil;
+import net.mooctest.www.android_auto_test.vo.DeviceStatusResult;
+import net.mooctest.www.android_auto_test.vo.TraceStatusResult;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
+@SpringBootTest
+@RunWith(PowerMockRunner.class)     // 这是必须的
+@PrepareForTest({Thread.class,
+            Thread[].class,
+            AutoTestServiceImpl.class})
+public class AutoTestServiceTest {
+
+    @Mock
+    TraceService traceService;
+
+    @Mock
+    OssService ossService;
+
+    @InjectMocks
+    AutoTestServiceImpl autoTestService = new AutoTestServiceImpl();
+
+    private TraceStatusResult ts;
+
+    private List<DeviceStatusResult> ds;
+
+    @Before
+    public void setUp(){
+        MockitoAnnotations.initMocks(this);
+
+        ts = new TraceStatusResult();
+        ts.setTraceId("123");
+
+        DeviceStatusResult dsr1 = new DeviceStatusResult();
+        dsr1.setDeviceId("ID1");
+        dsr1.setStatusCode(DeviceRunningStatus.RUNNING.getCode());
+        dsr1.setDescription(DeviceRunningStatus.RUNNING.getDescription());
+        DeviceStatusResult dsr2 = new DeviceStatusResult();
+        dsr1.setDeviceId("ID2");
+        dsr1.setStatusCode(DeviceRunningStatus.RUNNING.getCode());
+        dsr1.setDescription(DeviceRunningStatus.RUNNING.getDescription());
+        ds = Arrays.asList(dsr1, dsr2);
+    }
+
+    @Test
+    public void testStopTraceWhenTraceIdNotExists() {
+        // arrange
+        Thread t = PowerMockito.mock(Thread.class);
+        ThreadGroup tg = PowerMockito.mock(ThreadGroup.class);
+        PowerMockito.mockStatic(Thread.class);
+        when(Thread.currentThread()).thenReturn(t);
+        when(t.getThreadGroup()).thenReturn(tg);
+        when(tg.activeCount()).thenReturn(0);
+        when(tg.enumerate(any(Thread[].class))).thenReturn(0);
+
+        // action
+        try {
+            autoTestService.stopTrace("123");
+        } catch (Exception e) {
+            Assert.assertEquals(HttpNotFoundException.class, e.getClass());
+        }
+    }
+
+    @Test
+    public void testStopTraceWhenTraceIdExists() {
+        // arrange
+        Thread t = PowerMockito.mock(Thread.class);
+        ThreadGroup tg = PowerMockito.mock(ThreadGroup.class);
+        PowerMockito.mockStatic(Thread.class);
+        when(Thread.currentThread()).thenReturn(t);
+        when(t.getThreadGroup()).thenReturn(tg);
+        when(tg.activeCount()).thenReturn(2);
+        when(tg.enumerate(any(Thread[].class))).thenReturn(2);
+
+        // action
+        try {
+            autoTestService.stopTrace("123");
+        } catch (Exception e) {
+            // assert
+            Assert.assertEquals(NullPointerException.class, e.getClass());
+        }
+    }
+
+    @Test
+    public void testGetTraceResultWhenTraceIdNotExist(){
+        // arrange
+        when(traceService.getTraceStatue("123")).thenReturn(null);
+        // action
+        try {
+            autoTestService.getResult("123");
+        } catch (Exception e) {
+            // assert
+            Assert.assertEquals(HttpNotFoundException.class, e.getClass());
+        }
+    }
+
+    @Test
+    public void testGetTraceResultWhenNotFinished(){
+        // arrange
+        when(traceService.getTraceStatue("123")).thenReturn(TraceStatus.RUNNING);
+        when(traceService.getTraceDeviceStatus("123")).thenReturn(new ArrayList<>());
+        // action
+        TraceStatusResult traceStatusResult = autoTestService.getResult("123");
+        // assert
+        Assert.assertEquals("123", traceStatusResult.getTraceId());
+        Assert.assertNull(traceStatusResult.getDownloadUrl());
+    }
+
+    @Test
+    public void testGetTraceResultWhenHaveDevices(){
+        // arrange
+        when(traceService.getTraceStatue("123")).thenReturn(TraceStatus.RUNNING);
+        when(traceService.getTraceDeviceStatus("123")).thenReturn(ds);
+        // action
+        TraceStatusResult traceStatusResult = autoTestService.getResult("123");
+        // assert
+        Assert.assertEquals("123", traceStatusResult.getTraceId());
+        Assert.assertEquals(2, traceStatusResult.getExtraInfo().getJSONArray("deviceStatus").size());
+    }
+
+    @Test
+    public void testGetTraceStatusWhenFinished() {
+        // arrange
+        when(traceService.getTraceStatue("123")).thenReturn(TraceStatus.FINISH);
+        when(traceService.getTraceDeviceStatus("123")).thenReturn(ds);
+        when(ossService.getDadaJsonDownloadPath("123", Consts.REPORT_FILE_NAME)).thenReturn("url");
+        // action
+        TraceStatusResult traceStatusResult = autoTestService.getResult("123");
+        // assert
+        Assert.assertEquals("123", traceStatusResult.getTraceId());
+        Assert.assertEquals(2, traceStatusResult.getExtraInfo().getJSONArray("deviceStatus").size());
+        Assert.assertEquals("url", traceStatusResult.getDownloadUrl());
+    }
+}

+ 1 - 1
src/test/java/net/mooctest/www/android_auto_test/SecondaryTest/SecondaryServiceTest.java → src/test/java/net/mooctest/www/android_auto_test/ServiceImpl/SecondaryServiceTest.java

@@ -1,4 +1,4 @@
-package net.mooctest.www.android_auto_test.SecondaryTest;
+package net.mooctest.www.android_auto_test.ServiceImpl;
 
 
 import net.mooctest.www.android_auto_test.common.constant.enums.SecondaryStatus;

+ 98 - 0
src/test/java/net/mooctest/www/android_auto_test/ctrl/AutoTestControllerTest.java

@@ -0,0 +1,98 @@
+package net.mooctest.www.android_auto_test.ctrl;
+
+
+import net.mooctest.www.android_auto_test.common.constant.enums.TraceStatus;
+import net.mooctest.www.android_auto_test.controller.AutoTestController;
+import net.mooctest.www.android_auto_test.services.AutoTestService;
+import net.mooctest.www.android_auto_test.vo.TraceStatusResult;
+import org.json.JSONObject;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.MediaType;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.MvcResult;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+@SpringBootTest
+public class AutoTestControllerTest {
+
+    private MockMvc mockMvc;
+
+    @Mock
+    private AutoTestService autoTestService;
+
+    @InjectMocks
+    private AutoTestController autoTestController = new AutoTestController();
+
+    private TraceStatusResult ts;
+
+    @Before
+    public void setUp(){
+        MockitoAnnotations.initMocks(this);
+        mockMvc = MockMvcBuilders.standaloneSetup(autoTestController).build();
+
+        ts = new TraceStatusResult();
+        ts.setTraceId("123");
+    }
+
+    @Test
+    public void testStart() throws Exception{
+        // arrange
+        ts.setStatusCode(TraceStatus.INIT.getCode());
+        ts.setDescription(TraceStatus.INIT.getDescription());
+        when(autoTestService.executeAutoTestTask(any())).thenReturn(ts);
+        // action
+        MvcResult result = mockMvc.perform(post("/api/v1/runTest")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content("{}"))
+                .andDo(print()).andExpect(status().isOk()).andReturn();
+        // assert
+        JSONObject re = new JSONObject(result.getResponse().getContentAsString());
+        Assert.assertEquals("123", re.getString("traceId"));
+        Assert.assertEquals(TraceStatus.INIT.getCode(), re.getString("statusCode"));
+    }
+
+    @Test
+    public void testGetStatus() throws Exception{
+        // arrange
+        ts.setStatusCode(TraceStatus.FINISH.getCode());
+        ts.setDescription(TraceStatus.FINISH.getDescription());
+        when(autoTestService.getResult(any())).thenReturn(ts);
+        // action
+        MvcResult result = mockMvc.perform(get("/api/v1/result")
+                .param("traceId", "123")
+                .contentType(MediaType.APPLICATION_JSON))
+                .andDo(print()).andExpect(status().isOk()).andReturn();
+        // assert
+        JSONObject re = new JSONObject(result.getResponse().getContentAsString());
+        Assert.assertEquals("123", re.getString("traceId"));
+        Assert.assertEquals(TraceStatus.FINISH.getCode(), re.getString("statusCode"));
+    }
+
+    @Test
+    public void testStop() throws Exception{
+        // arrange
+        ts.setStatusCode(TraceStatus.FINISH.getCode());
+        ts.setDescription(TraceStatus.FINISH.getDescription());
+        when(autoTestService.stopTrace(any())).thenReturn(false);
+        // action
+        MvcResult result = mockMvc.perform(delete("/api/v1/result")
+                .param("traceId", "123")
+                .contentType(MediaType.APPLICATION_JSON))
+                .andDo(print()).andExpect(status().isOk()).andReturn();
+        // assert
+        boolean re = Boolean.parseBoolean(result.getResponse().getContentAsString());
+        Assert.assertFalse(re);
+    }
+}

+ 1 - 1
src/test/java/net/mooctest/www/android_auto_test/SecondaryTest/SecondaryControllerTest.java → src/test/java/net/mooctest/www/android_auto_test/ctrl/SecondaryControllerTest.java

@@ -1,4 +1,4 @@
-package net.mooctest.www.android_auto_test.SecondaryTest;
+package net.mooctest.www.android_auto_test.ctrl;
 
 import net.mooctest.www.android_auto_test.controller.SecondaryController;
 import net.mooctest.www.android_auto_test.services.SecondaryService;

+ 67 - 0
src/test/java/net/mooctest/www/android_auto_test/map/DeviceRunningStatusMapTest.java

@@ -0,0 +1,67 @@
+package net.mooctest.www.android_auto_test.map;
+
+import net.mooctest.www.android_auto_test.common.constant.enums.DeviceRunningStatus;
+import net.mooctest.www.android_auto_test.dao.RedisMappers.DeviceRunningStatusMap;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.*;
+
+@SpringBootTest
+public class DeviceRunningStatusMapTest {
+
+    @Mock
+    private StringRedisTemplate redisTemplate;
+
+    @Mock
+    private ValueOperations<String, String> valueOperations;
+
+    @InjectMocks
+    DeviceRunningStatusMap deviceRunningStatusMap;
+
+    @Before
+    public void setUp(){
+        MockitoAnnotations.initMocks(this);
+    }
+
+    @Test
+    public void testGetWhenHaveNoData(){
+        // arrange
+        when(redisTemplate.opsForValue()).thenReturn(valueOperations);
+        when(valueOperations.get("DEVICE_RUNNING_STATUS_222_111")).thenReturn(null);
+        // action
+        DeviceRunningStatus ds = deviceRunningStatusMap.get("111", "222");
+        // assert
+        Assert.assertNull(ds);
+    }
+
+    @Test
+    public void testGetWhenHaveData(){
+        // arrange
+        when(redisTemplate.opsForValue()).thenReturn(valueOperations);
+        when(valueOperations.get("DEVICE_RUNNING_STATUS_222_111")).thenReturn("2");
+        // action
+        DeviceRunningStatus ds = deviceRunningStatusMap.get("111", "222");
+        // assert
+        Assert.assertEquals(DeviceRunningStatus.RUNNING.getCode(), ds.getCode());
+    }
+
+    @Test
+    public void testSet(){
+        // arrange
+        when(redisTemplate.opsForValue()).thenReturn(valueOperations);
+        doNothing().when(valueOperations).set(anyString(), anyString());
+        // action
+        deviceRunningStatusMap.put("111","222",  DeviceRunningStatus.FINISH);
+        // assert
+        verify(valueOperations).set("DEVICE_RUNNING_STATUS_222_111", "4");
+    }
+}

+ 82 - 0
src/test/java/net/mooctest/www/android_auto_test/map/DeviceStatusMapTest.java

@@ -0,0 +1,82 @@
+package net.mooctest.www.android_auto_test.map;
+
+
+import net.mooctest.www.android_auto_test.common.constant.enums.DeviceStatus;
+import net.mooctest.www.android_auto_test.dao.RedisMappers.DeviceStatusMap;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+
+import java.util.List;
+
+import static org.mockito.Mockito.*;
+
+
+@SpringBootTest
+public class DeviceStatusMapTest {
+
+	@Mock
+	private StringRedisTemplate redisTemplate;
+
+	@Mock
+	private ValueOperations<String, String> valueOperations;
+
+	@InjectMocks
+	private DeviceStatusMap deviceStatusMap = new DeviceStatusMap();
+
+	@Before
+	public void setUp(){
+		MockitoAnnotations.initMocks(this);
+	}
+
+	@Test
+	public void testLuaScript(){
+		// arrange
+		when(redisTemplate.execute(any(), any(), anyString(), anyString())).thenReturn(1L);
+		// action
+		boolean result = deviceStatusMap.compareAndSet("test", DeviceStatus.RUNNING, DeviceStatus.FREE);
+		// assert
+		verify(redisTemplate).execute(any(), any(), anyString(), anyString());
+		Assert.assertTrue(result);
+	}
+
+	@Test
+	public void testGetWhenHaveNoData(){
+		// arrange
+		when(redisTemplate.opsForValue()).thenReturn(valueOperations);
+		when(valueOperations.get("DEVICE_STATUS_123")).thenReturn(null);
+		// action
+		DeviceStatus ds = deviceStatusMap.get("123");
+		// assert
+		Assert.assertEquals(DeviceStatus.FREE.getCode(), ds.getCode());
+	}
+
+	@Test
+	public void testGetWhenHaveData(){
+		// arrange
+		when(redisTemplate.opsForValue()).thenReturn(valueOperations);
+		when(valueOperations.get("DEVICE_STATUS_123")).thenReturn("2");
+		// action
+		DeviceStatus ds = deviceStatusMap.get("123");
+		// assert
+		Assert.assertEquals(DeviceStatus.OCCUPY.getCode(), ds.getCode());
+	}
+
+	@Test
+	public void testSet(){
+		// arrange
+		when(redisTemplate.opsForValue()).thenReturn(valueOperations);
+		doNothing().when(valueOperations).set(anyString(), anyString());
+		// action
+		deviceStatusMap.put("123", DeviceStatus.RUNNING);
+		// assert
+		verify(valueOperations).set(anyString(), anyString());
+	}
+
+}

+ 68 - 0
src/test/java/net/mooctest/www/android_auto_test/map/SecondaryStatusMapTest.java

@@ -0,0 +1,68 @@
+package net.mooctest.www.android_auto_test.map;
+
+import net.mooctest.www.android_auto_test.common.constant.enums.SecondaryStatus;
+import net.mooctest.www.android_auto_test.dao.RedisMappers.SecondaryStatusMap;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.*;
+
+@SpringBootTest
+public class SecondaryStatusMapTest {
+
+    @Mock
+    private StringRedisTemplate redisTemplate;
+
+    @Mock
+    private ValueOperations<String, String> valueOperations;
+
+    @InjectMocks
+    private SecondaryStatusMap secondaryStatusMap = new SecondaryStatusMap();
+
+    @Before
+    public void setUp(){
+        MockitoAnnotations.initMocks(this);
+    }
+
+    @Test
+    public void testGetWhenHaveNoData(){
+        // arrange
+        when(redisTemplate.opsForValue()).thenReturn(valueOperations);
+        when(valueOperations.get("TRACE_SECONDARY_STATUS_111_222")).thenReturn(null);
+        // action
+        SecondaryStatus ds = secondaryStatusMap.get("111", "222");
+        // assert
+        Assert.assertNull(ds);
+    }
+
+    @Test
+    public void testGetWhenHaveData(){
+        // arrange
+        when(redisTemplate.opsForValue()).thenReturn(valueOperations);
+        when(valueOperations.get("TRACE_SECONDARY_STATUS_111_222")).thenReturn("1");
+        // action
+        SecondaryStatus ds = secondaryStatusMap.get("111", "222");
+        // assert
+        Assert.assertEquals(SecondaryStatus.RUNNING.getCode(), ds.getCode());
+    }
+
+    @Test
+    public void testSet(){
+        // arrange
+        when(redisTemplate.opsForValue()).thenReturn(valueOperations);
+        doNothing().when(valueOperations).set(anyString(), anyString());
+        // action
+        secondaryStatusMap.put("111","222",  SecondaryStatus.SUCCESS);
+        // assert
+        verify(valueOperations).set("TRACE_SECONDARY_STATUS_111_222", "5");
+    }
+
+}

+ 72 - 0
src/test/java/net/mooctest/www/android_auto_test/map/TraceDeviceMapTest.java

@@ -0,0 +1,72 @@
+package net.mooctest.www.android_auto_test.map;
+
+import net.mooctest.www.android_auto_test.common.constant.enums.SecondaryStatus;
+import net.mooctest.www.android_auto_test.dao.RedisMappers.Trace2DeviceMap;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.mockito.Mockito.*;
+
+@SpringBootTest
+public class TraceDeviceMapTest {
+    @Mock
+    private StringRedisTemplate redisTemplate;
+
+    @Mock
+    private ValueOperations<String, String> valueOperations;
+
+    @InjectMocks
+    private Trace2DeviceMap trace2DeviceMap = new Trace2DeviceMap();
+
+    @Before
+    public void setUp(){
+        MockitoAnnotations.initMocks(this);
+    }
+
+    @Test
+    public void testGet(){
+        // arrange
+        when(redisTemplate.opsForValue()).thenReturn(valueOperations);
+        when(valueOperations.get("TRACE_DEVICES_aaa")).thenReturn("[\"d1\",\"d2\",\"d3\"]");
+        // action
+        List<String> result = trace2DeviceMap.get("aaa");
+        // assert
+        Assert.assertEquals(3, result.size());
+    }
+
+    @Test
+    public void testSetWhenListNotEmpty(){
+        // arrange
+        List<String> ids = Arrays.asList("d1", "d2", "d3");
+        when(redisTemplate.opsForValue()).thenReturn(valueOperations);
+        doNothing().when(valueOperations).set("TRACE_DEVICES_aaa", "[\"d1\",\"d2\",\"d3\"]");
+        // action
+        trace2DeviceMap.put("aaa", ids);
+        // assert
+        verify(valueOperations).set("TRACE_DEVICES_aaa", "[\"d1\",\"d2\",\"d3\"]");
+    }
+
+    @Test
+    public void testSetWhenListIsEmpty(){
+        // arrange
+        List<String> ids = new ArrayList<>();
+        when(redisTemplate.opsForValue()).thenReturn(valueOperations);
+        doNothing().when(valueOperations).set("TRACE_DEVICES_aaa", "[]");
+        // action
+        trace2DeviceMap.put("aaa", ids);
+        // assert
+        verify(valueOperations).set("TRACE_DEVICES_aaa", "[]");
+    }
+
+}

+ 67 - 0
src/test/java/net/mooctest/www/android_auto_test/map/TraceStatusMapTest.java

@@ -0,0 +1,67 @@
+package net.mooctest.www.android_auto_test.map;
+
+import net.mooctest.www.android_auto_test.common.constant.enums.TraceStatus;
+import net.mooctest.www.android_auto_test.dao.RedisMappers.TraceStatusMap;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.*;
+
+@SpringBootTest
+public class TraceStatusMapTest {
+    @Mock
+    private StringRedisTemplate redisTemplate;
+
+    @Mock
+    private ValueOperations<String, String> valueOperations;
+
+    @InjectMocks
+    private TraceStatusMap traceStatusMap = new TraceStatusMap();
+
+    @Before
+    public void setUp(){
+        MockitoAnnotations.initMocks(this);
+    }
+
+    @Test
+    public void testGetWhenHaveNoData(){
+        // arrange
+        when(redisTemplate.opsForValue()).thenReturn(valueOperations);
+        when(valueOperations.get("TRACE_STATUS_ttt")).thenReturn(null);
+        // action
+        TraceStatus ds = traceStatusMap.get("ttt");
+        // assert
+        Assert.assertNull(ds);
+    }
+
+    @Test
+    public void testGetWhenHaveData(){
+        // arrange
+        when(redisTemplate.opsForValue()).thenReturn(valueOperations);
+        when(valueOperations.get("TRACE_STATUS_ttt")).thenReturn(TraceStatus.RUNNING.getCode());
+        // action
+        TraceStatus ds = traceStatusMap.get("ttt");
+        // assert
+        Assert.assertEquals(TraceStatus.RUNNING.getCode(), ds.getCode());
+    }
+
+    @Test
+    public void testSet(){
+        // arrange
+        when(redisTemplate.opsForValue()).thenReturn(valueOperations);
+        doNothing().when(valueOperations).set(anyString(), anyString());
+        // action
+        traceStatusMap.put("ttt",  TraceStatus.FINISH);
+        // assert
+        verify(valueOperations).set("TRACE_STATUS_ttt", "3");
+    }
+
+}