diff --git a/api-web/api-interface/src/test/java/com/heyu/api/controller/doc/ForgeryDetectionControllerTest.java b/api-web/api-interface/src/test/java/com/heyu/api/controller/doc/ForgeryDetectionControllerTest.java index dc2a379..878af99 100644 --- a/api-web/api-interface/src/test/java/com/heyu/api/controller/doc/ForgeryDetectionControllerTest.java +++ b/api-web/api-interface/src/test/java/com/heyu/api/controller/doc/ForgeryDetectionControllerTest.java @@ -1,222 +1,76 @@ package com.heyu.api.controller.doc; -import com.heyu.api.baidu.handle.doc.BForgeryDetectionHandle; -import com.heyu.api.baidu.request.doc.BForgeryDetectionRequest; -import com.heyu.api.baidu.response.doc.BForgeryDetectionResp; -import com.heyu.api.data.utils.ApiR; +import com.ApiInterfaceApplicationTests; +import com.alibaba.fastjson.JSON; import com.heyu.api.data.utils.R; import com.heyu.api.request.doc.ForgeryDetectionRequest; import com.heyu.api.resp.doc.ForgeryDetectionResp; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import java.util.ArrayList; -import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; /** - * ForgeryDetectionController 单元测试 + * 图片篡改检测 - 在线图片验证 + * + * 调用本地 /doc/forgeryDetection 接口,验证目标图片是否被篡改。 + * + * 假设(Given): 目标图片可访问,百度 API 可用 + * 当(When): 调用 forgeryDetection 接口,所有参数开启 + * 则(Then): 返回检测结果 + * + * @author zhengli + * @since 20260528_zl */ -public class ForgeryDetectionControllerTest { +public class ForgeryDetectionControllerTest extends ApiInterfaceApplicationTests { - @InjectMocks - private ForgeryDetectionController controller; + @Autowired + private ForgeryDetectionController forgeryDetectionController; - @Mock - private BForgeryDetectionHandle bForgeryDetectionHandle; - - @BeforeEach - public void setUp() { - MockitoAnnotations.initMocks(this); - } - - // ========== 正常流程测试 ========== + private static final String TARGET_IMAGE_URL = "https://www.opsky.com.cn/upload/20211224/KXfgvm2MFRAXKbPu5LK.png"; @Test - public void forgeryDetectionSuccessTest() { + void forgeryDetectionAllParamsTest() { + // 1. 构造请求 - 所有参数开启 ForgeryDetectionRequest request = new ForgeryDetectionRequest(); - request.setImageBase64("base64ImageData"); - - BForgeryDetectionResp bResp = new BForgeryDetectionResp(); - BForgeryDetectionResp.ResultDTO result = new BForgeryDetectionResp.ResultDTO(); - result.setDetectionResult("fake"); - result.setTamperedProportion(0.85); - bResp.setResult(result); - - when(bForgeryDetectionHandle.handle(any(BForgeryDetectionRequest.class))) - .thenReturn(ApiR.setData(bResp)); - - R r = controller.forgeryDetection(request); - - assertNotNull(r); - assertEquals("200", r.getCode()); - ForgeryDetectionResp resp = r.getData(); - assertNotNull(resp); - assertEquals("fake", resp.getDetectionResult()); - assertEquals(Double.valueOf(0.85), resp.getTamperedProportion()); - } - - @Test - public void forgeryDetectionRealImageTest() { - ForgeryDetectionRequest request = new ForgeryDetectionRequest(); - request.setImageUrl("https://example.com/image.jpg"); - - BForgeryDetectionResp bResp = new BForgeryDetectionResp(); - BForgeryDetectionResp.ResultDTO result = new BForgeryDetectionResp.ResultDTO(); - result.setDetectionResult("real"); - bResp.setResult(result); - - when(bForgeryDetectionHandle.handle(any(BForgeryDetectionRequest.class))) - .thenReturn(ApiR.setData(bResp)); - - R r = controller.forgeryDetection(request); - - assertNotNull(r); - assertEquals("200", r.getCode()); - assertEquals("real", r.getData().getDetectionResult()); - assertNull(r.getData().getTamperedProportion()); - } - - @Test - public void forgeryDetectionWithHeatmapTest() { - ForgeryDetectionRequest request = new ForgeryDetectionRequest(); - request.setImageBase64("base64ImageData"); - request.setReturnHeatmap("true"); - - BForgeryDetectionResp bResp = new BForgeryDetectionResp(); - BForgeryDetectionResp.ResultDTO result = new BForgeryDetectionResp.ResultDTO(); - result.setDetectionResult("fake"); - result.setHeatmap("heatmapBase64Data"); - bResp.setResult(result); - - when(bForgeryDetectionHandle.handle(any(BForgeryDetectionRequest.class))) - .thenReturn(ApiR.setData(bResp)); - - R r = controller.forgeryDetection(request); - - assertEquals("fake", r.getData().getDetectionResult()); - assertEquals("heatmapBase64Data", r.getData().getHeatmap()); - } - - @Test - public void forgeryDetectionWithTamperedLocationTest() { - ForgeryDetectionRequest request = new ForgeryDetectionRequest(); - request.setImageBase64("base64ImageData"); - request.setRestrictProbability("0.5"); - - BForgeryDetectionResp bResp = new BForgeryDetectionResp(); - BForgeryDetectionResp.ResultDTO result = new BForgeryDetectionResp.ResultDTO(); - result.setDetectionResult("fake"); - - List locations = new ArrayList<>(); - BForgeryDetectionResp.TamperedLocationDTO loc = new BForgeryDetectionResp.TamperedLocationDTO(); - loc.setLeft(100); - loc.setTop(200); - loc.setWidth(300); - loc.setHeight(150); - loc.setProbability(0.95); - locations.add(loc); - result.setTamperedLocation(locations); - bResp.setResult(result); - - when(bForgeryDetectionHandle.handle(any(BForgeryDetectionRequest.class))) - .thenReturn(ApiR.setData(bResp)); - - R r = controller.forgeryDetection(request); - - ForgeryDetectionResp resp = r.getData(); - assertNotNull(resp.getTamperedLocation()); - assertEquals(1, resp.getTamperedLocation().size()); - ForgeryDetectionResp.TamperedLocation respLoc = resp.getTamperedLocation().get(0); - assertEquals(Integer.valueOf(100), respLoc.getLeft()); - assertEquals(Integer.valueOf(200), respLoc.getTop()); - assertEquals(Integer.valueOf(300), respLoc.getWidth()); - assertEquals(Integer.valueOf(150), respLoc.getHeight()); - assertEquals(Double.valueOf(0.95), respLoc.getProbability()); - } - - // ========== 异常流程测试 ========== - - @Test - public void forgeryDetectionHandleErrorTest() { - ForgeryDetectionRequest request = new ForgeryDetectionRequest(); - - when(bForgeryDetectionHandle.handle(any(BForgeryDetectionRequest.class))) - .thenReturn(ApiR.error("imageUrl和imageBase64不能同时为空")); - - R r = controller.forgeryDetection(request); - - assertNotNull(r); - assertEquals("400", r.getCode()); - assertEquals("imageUrl和imageBase64不能同时为空", r.getMsg()); - } - - @Test - public void forgeryDetectionResultNullTest() { - ForgeryDetectionRequest request = new ForgeryDetectionRequest(); - request.setImageBase64("data"); - - BForgeryDetectionResp bResp = new BForgeryDetectionResp(); - bResp.setResult(null); - - when(bForgeryDetectionHandle.handle(any(BForgeryDetectionRequest.class))) - .thenReturn(ApiR.setData(bResp)); - - R r = controller.forgeryDetection(request); - - assertNotNull(r); - assertEquals("400", r.getCode()); - } - - // ========== 请求映射测试 ========== - - @Test - public void toBaiduRequestMappingTest() { - ForgeryDetectionRequest request = new ForgeryDetectionRequest(); - request.setImageBase64("base64"); - request.setImageUrl("https://example.com/img.jpg"); + request.setImageUrl(TARGET_IMAGE_URL); request.setDetectProportion("true"); - request.setDetectThreshold("0.9"); + request.setDetectThreshold("0.9887"); request.setReturnHeatmap("true"); request.setRestrictProbability("0.8"); - BForgeryDetectionResp bResp = new BForgeryDetectionResp(); - BForgeryDetectionResp.ResultDTO result = new BForgeryDetectionResp.ResultDTO(); - result.setDetectionResult("real"); - bResp.setResult(result); + // 2. 调用本地 /doc/forgeryDetection 接口 + R result = forgeryDetectionController.forgeryDetection(request); - when(bForgeryDetectionHandle.handle(any(BForgeryDetectionRequest.class))) - .thenAnswer(invocation -> { - BForgeryDetectionRequest bReq = invocation.getArgument(0); - assertEquals("base64", bReq.getImageBase64()); - assertEquals("https://example.com/img.jpg", bReq.getImageUrl()); - assertEquals("true", bReq.getDetectProportion()); - assertEquals("0.9", bReq.getDetectThreshold()); - assertEquals("true", bReq.getReturnHeatmap()); - assertEquals("0.8", bReq.getRestrictProbability()); - return ApiR.setData(bResp); - }); + // 3. 断言 + assertNotNull(result, "返回结果不能为空"); + assertEquals("200", result.getCode(), "接口应返回成功"); + assertNotNull(result.getData(), "返回数据不能为空"); - R r = controller.forgeryDetection(request); - assertEquals("200", r.getCode()); - } + // 4. 打印接口返回值 + ForgeryDetectionResp data = result.getData(); + String heatmapDisplay = data.getHeatmap() != null + ? data.getHeatmap().substring(0, Math.min(50, data.getHeatmap().length())) + "...(共" + data.getHeatmap().length() + "字符)" + : "null"; - @Test - public void toBaiduRequestNullInputTest() { - ForgeryDetectionRequest request = null; + System.out.println("\n========== /doc/forgeryDetection 接口返回 =========="); + System.out.println("{\"code\":\"" + result.getCode() + "\","); + System.out.println(" \"msg\":\"" + result.getMsg() + "\","); + System.out.println(" \"data\":{"); + System.out.println(" \"detectionResult\":\"" + data.getDetectionResult() + "\","); + System.out.println(" \"tamperedProportion\":" + data.getTamperedProportion() + ","); + System.out.println(" \"heatmap\":\"" + heatmapDisplay + "\","); + System.out.println(" \"tamperedLocation\":" + JSON.toJSONString(data.getTamperedLocation())); + System.out.println(" }"); + System.out.println("}"); + System.out.println("===================================================="); - when(bForgeryDetectionHandle.handle(any(BForgeryDetectionRequest.class))) - .thenReturn(ApiR.error("你的image , url不能都为空")); - - R r = controller.forgeryDetection(request); - assertEquals("400", r.getCode()); + // 结论 + if ("fake".equals(data.getDetectionResult())) { + System.out.println(">>> 结论: 图片【已被篡改】,篡改置信度: " + data.getTamperedProportion()); + } else { + System.out.println(">>> 结论: 图片【未被篡改】,篡改置信度: " + data.getTamperedProportion()); + } } }