diff --git a/admin-test/src/main/java/com/ibeetl/admin/test/util/test/RandomUtils.java b/admin-test/src/main/java/com/ibeetl/admin/test/util/test/RandomUtils.java index 76dc59e0..3293bb8f 100644 --- a/admin-test/src/main/java/com/ibeetl/admin/test/util/test/RandomUtils.java +++ b/admin-test/src/main/java/com/ibeetl/admin/test/util/test/RandomUtils.java @@ -13,7 +13,7 @@ import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; -import static java.lang.Math.min; +import static java.lang.Math.max; /** * 随机工具类 @@ -136,7 +136,8 @@ public class RandomUtils { public static String getRandomString(List list, int randomLength, Function function, CharSequence delimiter) { Objects.requireNonNull(list); // 取随机数长度的集合 - List questionList = RandomUtil.randomEleList(list, RandomUtil.randomInt(min(list.size() == 0 ? 1: list.size(), randomLength))); + int size = max(randomLength, list.size()) + 1; + List questionList = RandomUtil.randomEleList(list, RandomUtil.randomInt(1, size)); return questionList.stream() .map(e -> String.valueOf(function.apply(e))) diff --git a/web/src/main/java/com/ibeetl/jlw/entity/ResourcesQuestionOptionEntity.java b/web/src/main/java/com/ibeetl/jlw/entity/ResourcesQuestionOptionEntity.java index acd9c0eb..e898ad24 100644 --- a/web/src/main/java/com/ibeetl/jlw/entity/ResourcesQuestionOptionEntity.java +++ b/web/src/main/java/com/ibeetl/jlw/entity/ResourcesQuestionOptionEntity.java @@ -118,6 +118,10 @@ public class ResourcesQuestionOptionEntity { List optionTextList = optionEntity.getOptionTextList(); // 答案和选项ABCDEF..对应 Map answerMap = new HashMap<>(6); + // 判断题目是否有重复的值 + Assert.isTrue(optionTextList.size() == lastLetterFieldNameList.size(), + "答案中有重复的值,请检查!"); + // 乱序集合处理 for (int i = 0; i < lastLetterFieldNameList.size(); i++) { // 选项的子母 diff --git a/web/src/main/java/com/ibeetl/jlw/service/ResourcesQuestionSnapshotService.java b/web/src/main/java/com/ibeetl/jlw/service/ResourcesQuestionSnapshotService.java index 6472dc3c..93eb5c1f 100644 --- a/web/src/main/java/com/ibeetl/jlw/service/ResourcesQuestionSnapshotService.java +++ b/web/src/main/java/com/ibeetl/jlw/service/ResourcesQuestionSnapshotService.java @@ -160,11 +160,10 @@ public class ResourcesQuestionSnapshotService extends CoreBaseService valuesByQuery = getValuesByQuery(resourcesQuestionSnapshotQuery); - +// ResourcesQuestionSnapshotQuery resourcesQuestionSnapshotQuery = new ResourcesQuestionSnapshotQuery(); +// resourcesQuestionSnapshotQuery.setFromId(fromId); +// resourcesQuestionSnapshotQuery.setFromType(fromType); +// List valuesByQuery = getValuesByQuery(resourcesQuestionSnapshotQuery); // 查询学生身份 Student student = studentDao.getByUserId(getUserId()); diff --git a/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseHomeworkService.java b/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseHomeworkService.java index 2c33cbd3..263f0e02 100644 --- a/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseHomeworkService.java +++ b/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseHomeworkService.java @@ -1,5 +1,6 @@ package com.ibeetl.jlw.service; +import cn.hutool.core.lang.Assert; import cn.hutool.extra.validation.BeanValidationResult; import cn.hutool.extra.validation.ValidationUtil; import cn.jlw.util.ToolUtils; @@ -20,7 +21,6 @@ import com.ibeetl.jlw.web.query.TeacherOpenCourseHomeworkSettingQuery; import org.apache.commons.lang3.StringUtils; import org.beetl.sql.core.SqlId; import org.beetl.sql.core.engine.PageQuery; -import org.junit.Assert; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -174,7 +174,7 @@ public class TeacherOpenCourseHomeworkService extends CoreBaseService studentList = studentDao.execute( "select org_id, user_id " + @@ -63,6 +69,29 @@ public class BaseTest { TestEnvUtil.setProperty("user.orgId", student.getOrgId().toString()); } + /** + * 随机一个老师登录信息到配置文件中,用于session登录信息 + * 也可以在application-test.properties 修改登录信息 + * + * @throws Exception + */ + public void putTeacherLoginInfoToEnv() throws Exception { + // 随机取一个学生的登录信息 + List teacherList = teacherDao.execute( + "select org_id, user_id " + + "from teacher t \n" + + "where t.teacher_status = 1\t\n" + + "order by RAND() \n" + + "limit 1 "); + + Assert.assertTrue("教师表表为空,程序中断!", ObjectUtil.isNotEmpty(teacherList)); + // 学生ID + Teacher teacher = CollectionUtils.firstElement(teacherList); + // 换学生身份登录系统 + TestEnvUtil.setProperty("user.id", teacher.getUserId().toString()); + TestEnvUtil.setProperty("user.orgId", teacher.getOrgId().toString()); + } + /** * 清空临时存放的环境变量,清除session登录信息 * @throws Exception diff --git a/web/src/test/java/com/ibeetl/jlw/web/ResourcesQuestionSnapshotControllerTest.java b/web/src/test/java/com/ibeetl/jlw/web/ResourcesQuestionSnapshotControllerTest.java index f9b96712..67b44fe1 100644 --- a/web/src/test/java/com/ibeetl/jlw/web/ResourcesQuestionSnapshotControllerTest.java +++ b/web/src/test/java/com/ibeetl/jlw/web/ResourcesQuestionSnapshotControllerTest.java @@ -2,9 +2,9 @@ package com.ibeetl.jlw.web; import base.BaseTest; import cn.hutool.core.util.ObjectUtil; -import com.ibeetl.jlw.dao.ResourcesQuestionSnapshotDao; -import com.ibeetl.jlw.entity.ResourcesQuestionSnapshot; -import com.ibeetl.jlw.enums.TeacherOpenCourseQuestionFromTypeEnum; +import com.ibeetl.admin.test.util.test.TestEnvUtil; +import com.ibeetl.jlw.dao.TeacherOpenCourseQuestionLogDao; +import com.ibeetl.jlw.entity.TeacherOpenCourseQuestionLog; import org.junit.Assert; import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; @@ -16,7 +16,6 @@ import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.util.List; -import static com.ibeetl.admin.test.util.test.RandomUtils.randomSet; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** @@ -34,42 +33,46 @@ class ResourcesQuestionSnapshotControllerTest extends BaseTest { private static final String API = "/api/resourcesQuestionSnapshot"; @Resource - ResourcesQuestionSnapshotDao resourcesQuestionSnapshotDao; + TeacherOpenCourseQuestionLogDao teacherOpenCourseQuestionLogDao; @Test void getScoreInfo() throws Exception { - // 获取一个状态正常的作业ID + try { + TeacherOpenCourseQuestionLog entity = new TeacherOpenCourseQuestionLog(); + entity.setTeacherOpenCourseQuestionLogStatus(1); + List questionLogs = teacherOpenCourseQuestionLogDao.template(entity); + // 断言 + Assert.assertTrue(ObjectUtil.isNotEmpty(questionLogs)); - ResourcesQuestionSnapshot entity = new ResourcesQuestionSnapshot(); - entity.setQuestionStatus(1); - List homeworkList = resourcesQuestionSnapshotDao.template(entity); - // 断言 - Assert.assertTrue(ObjectUtil.isNotEmpty(homeworkList)); + // 取第一个 + TeacherOpenCourseQuestionLog questionLog = CollectionUtils.firstElement(questionLogs); - // 随机取一个学生的登录信息 - putEnvLoginInfoStudent(); + // 模拟登录学生身份 + TestEnvUtil.setProperty("user.id", questionLog.getUserId().toString()); + TestEnvUtil.setProperty("user.orgId", questionLog.getOrgId().toString()); - // 随机来源类型 - TeacherOpenCourseQuestionFromTypeEnum fromTypeEnum = CollectionUtils - .firstElement(randomSet(TeacherOpenCourseQuestionFromTypeEnum.class)); + // 随机取一个学生的登录信息 + putStudentLoginInfoToEnv(); - //构造请求参数 - RequestBuilder rb = MockMvcRequestBuilders.post(MODEL + "/getScoreInfo.json") - .contentType(MediaType.APPLICATION_FORM_URLENCODED_VALUE) - .param("fromType", fromTypeEnum.name()) - // TODO 这里需要修改灵活的来源ID - .param("fromId", fromTypeEnum.name()) - ; + //构造请求参数 + RequestBuilder rb = MockMvcRequestBuilders.post(MODEL + "/getScoreInfo.json") + .contentType(MediaType.APPLICATION_FORM_URLENCODED_VALUE) + .param("fromType", questionLog.getTeacherOpenCourseQuestionLogFromType().toString()) + .param("fromId", questionLog.getTeacherOpenCourseQuestionLogFromId().toString()) + ; - //发送请求,验证返回结果 - String result = mvc.perform(rb) - .andExpect(status().isOk()) - .andExpect(MockMvcResultMatchers.jsonPath("$.code").value("0")) - .andReturn().getResponse().getContentAsString(); + //发送请求,验证返回结果 + String result = mvc.perform(rb) + .andExpect(status().isOk()) + .andExpect(MockMvcResultMatchers.jsonPath("$.code").value("0")) + .andReturn().getResponse().getContentAsString(); - // 换回去原始的登录方式 - clearEnvLoginInfo(); - - System.out.println(result); + System.out.println(result); + }catch (Exception e) { + throw e; + }finally { + // 清除登录信息 + clearEnvLoginInfo(); + } } } \ No newline at end of file diff --git a/web/src/test/java/com/ibeetl/jlw/web/TeacherOpenCourseHomeworkControllerTest.java b/web/src/test/java/com/ibeetl/jlw/web/TeacherOpenCourseHomeworkControllerTest.java index 0c8dfcaa..1a7e7841 100644 --- a/web/src/test/java/com/ibeetl/jlw/web/TeacherOpenCourseHomeworkControllerTest.java +++ b/web/src/test/java/com/ibeetl/jlw/web/TeacherOpenCourseHomeworkControllerTest.java @@ -31,6 +31,7 @@ import java.util.List; import static cn.hutool.json.JSONUtil.toJsonStr; import static com.ibeetl.admin.test.util.test.RandomUtils.getRandomString; import static com.ibeetl.admin.test.util.test.RandomUtils.randomPojo; +import static java.util.stream.Collectors.joining; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @Slf4j @@ -114,7 +115,8 @@ class TeacherOpenCourseHomeworkControllerTest extends BaseTest { // 所有题目 ResourcesQuestion resourcesQuestion = new ResourcesQuestion(); resourcesQuestion.setQuestionStatus(1); - List valuesByQuery = resourcesQuestionDao.template(resourcesQuestion); + List valuesByQuery = resourcesQuestionDao.execute("select * from resources_question where\n" + + "question_status = 1 limit 50"); // 断言 题目表不能为空 Assert.assertTrue(ObjectUtil.isNotEmpty(valuesByQuery)); @@ -128,7 +130,8 @@ class TeacherOpenCourseHomeworkControllerTest extends BaseTest { Assert.assertTrue(ObjectUtil.isNotEmpty(schoolClassList)); // 随机选题 - String resourcesQuestionIds = getRandomString(valuesByQuery, ResourcesQuestion::getResourcesQuestionId); + String resourcesQuestionIds = valuesByQuery.stream().map(ResourcesQuestion::getResourcesQuestionId) + .map(String::valueOf).collect(joining(",")); // 随机产生班级ID集合 String schoolClassIds = getRandomString(schoolClassList, SchoolClass::getClassId); diff --git a/web/src/test/java/com/ibeetl/jlw/web/TeacherOpenCourseQuestionLogControllerTest.java b/web/src/test/java/com/ibeetl/jlw/web/TeacherOpenCourseQuestionLogControllerTest.java index c0482b5a..2a377d54 100644 --- a/web/src/test/java/com/ibeetl/jlw/web/TeacherOpenCourseQuestionLogControllerTest.java +++ b/web/src/test/java/com/ibeetl/jlw/web/TeacherOpenCourseQuestionLogControllerTest.java @@ -41,62 +41,66 @@ class TeacherOpenCourseQuestionLogControllerTest extends BaseTest { */ @Test void addQuestionLog() throws Exception { - // 通过查询数据库来random实体类属性 - // 随机取一个学生的登录信息 - List questionSnapshots = resourcesQuestionSnapshotDao.execute( - "select t.* \n" + - "from resources_question_snapshot t \n" + - "where t.question_status = 1\t\n" + - "order by RAND() \n" + - "limit 10 "); + try { + // 通过查询数据库来random实体类属性 + // 随机取一个学生的登录信息 + List questionSnapshots = resourcesQuestionSnapshotDao.execute( + "select t.* \n" + + "from resources_question_snapshot t \n" + + "where t.question_status = 1\t\n" + + "order by RAND() \n" + + "limit 10 "); - // 随机取题目ID和答案 - Map> answerRandomMap = new ConcurrentHashMap<>(); - questionSnapshots.stream().forEach(item -> { - TreeSet answer = new TreeSet<>(); - // 单选 - if (item.getQuestionType().equals(1)) { - String[] simpleOptions = ObjectUtil.isEmpty(item.getQuestionOptionE()) - ? new String[]{"A", "B", "C", "D"} : new String[]{"A", "B", "C", "D", "E"}; - answer.add(RandomUtil.randomEle(simpleOptions)); - } - // 多选 - if (item.getQuestionType().equals(2)) { - String[] multipleOptions = ObjectUtil.isEmpty(item.getQuestionOptionE()) - ? new String[]{"A", "B", "C", "D"} : new String[]{"A", "B", "C", "D", "E"}; - Set randomAnswerSet = RandomUtil - .randomEleSet(Arrays.asList(multipleOptions), RandomUtil.randomInt(2, multipleOptions.length)); - //排序去重 逗号分割 - answer.add(join(new TreeSet<>(randomAnswerSet).toArray(), ",")); - } - // 判断 - if (item.getQuestionType().equals(3)) { - answer.add(RandomUtil.randomEle(Arrays.asList("对", "错"))); - } - answerRandomMap.put(item.getResourcesQuestionSnapshotId(), answer); - }); + // 随机取题目ID和答案 + Map> answerRandomMap = new ConcurrentHashMap<>(); + questionSnapshots.stream().forEach(item -> { + TreeSet answer = new TreeSet<>(); + // 单选 + if (item.getQuestionType().equals(1)) { + String[] simpleOptions = ObjectUtil.isEmpty(item.getQuestionOptionE()) + ? new String[]{"A", "B", "C", "D"} : new String[]{"A", "B", "C", "D", "E"}; + answer.add(RandomUtil.randomEle(simpleOptions)); + } + // 多选 + if (item.getQuestionType().equals(2)) { + String[] multipleOptions = ObjectUtil.isEmpty(item.getQuestionOptionE()) + ? new String[]{"A", "B", "C", "D"} : new String[]{"A", "B", "C", "D", "E"}; + Set randomAnswerSet = RandomUtil + .randomEleSet(Arrays.asList(multipleOptions), RandomUtil.randomInt(2, multipleOptions.length)); + //排序去重 逗号分割 + answer.add(join(new TreeSet<>(randomAnswerSet).toArray(), ",")); + } + // 判断 + if (item.getQuestionType().equals(3)) { + answer.add(RandomUtil.randomEle(Arrays.asList("对", "错"))); + } + answerRandomMap.put(item.getResourcesQuestionSnapshotId(), answer); + }); - // 随机取一个学生的登录信息 - putEnvLoginInfoStudent(); + // 随机取一个学生的登录信息 + putStudentLoginInfoToEnv(); - // 随机来源类型 - TeacherOpenCourseQuestionFromTypeEnum fromTypeEnum = CollectionUtils - .firstElement(randomSet(TeacherOpenCourseQuestionFromTypeEnum.class)); + // 随机来源类型 + TeacherOpenCourseQuestionFromTypeEnum fromTypeEnum = CollectionUtils + .firstElement(randomSet(TeacherOpenCourseQuestionFromTypeEnum.class)); - //构造请求参数 - RequestBuilder rb = MockMvcRequestBuilders.post(MODEL + "/addQuestionLog.json") - .contentType(MediaType.APPLICATION_JSON_VALUE) - .param("fromType", fromTypeEnum.name()) - .content(toJsonStr(answerRandomMap)); - //发送请求,验证返回结果 - String result = mvc.perform(rb) - .andExpect(status().isOk()) - .andExpect(MockMvcResultMatchers.jsonPath("$.code").value("0")) - .andReturn().getResponse().getContentAsString(); + //构造请求参数 + RequestBuilder rb = MockMvcRequestBuilders.post(MODEL + "/addQuestionLog.json") + .contentType(MediaType.APPLICATION_JSON_VALUE) + .param("fromType", fromTypeEnum.name()) + .content(toJsonStr(answerRandomMap)); + //发送请求,验证返回结果 + String result = mvc.perform(rb) + .andExpect(status().isOk()) + .andExpect(MockMvcResultMatchers.jsonPath("$.code").value("0")) + .andReturn().getResponse().getContentAsString(); - // 换回去原始的登录方式 - clearEnvLoginInfo(); - - System.out.println(result); + System.out.println(result); + }catch (Exception e) { + throw e; + }finally { + // 清除登录信息 + clearEnvLoginInfo(); + } } } \ No newline at end of file diff --git a/web/src/test/resources/application-test.properties b/web/src/test/resources/application-test.properties index 6914f331..248f89fc 100644 --- a/web/src/test/resources/application-test.properties +++ b/web/src/test/resources/application-test.properties @@ -35,4 +35,8 @@ dynamic.beetlsql.master.dbStyle = org.beetl.sql.core.db.MySqlStyle # \u6A21\u62DF\u7528\u6237\u767B\u5F55 \u53EA\u80FD\u7528\u5728\u672C\u5730\u6D4B\u8BD5\u65F6\u5019\u4F7F\u7528 user.id=1 -user.orgId=1 \ No newline at end of file +user.orgId=1 + +junit.jupiter.execution.parallel.enabled = true +junit.jupiter.execution.parallel.mode.default = concurrent +junit.jupiter.execution.parallel.mode.classes.default = concurrent \ No newline at end of file