代码之家  ›  专栏  ›  技术社区  ›  snaik

我的JUNIT代码不适用于jsonObject

  •  0
  • snaik  · 技术社区  · 2 年前

    我在java类下面写过

    import java.io.BufferedReader;
    import java.io.ByteArrayInputStream;
    import java.io.InputStream;
    import java.nio.charset.StandardCharsets;
    import java.util.Base64;
    import java.util.HashMap;
    import java.util.Map;
    
    import org.apache.sling.api.SlingHttpServletRequest;
    import org.apache.sling.api.resource.LoginException;
    import org.apache.sling.api.resource.ResourceResolver;
    import org.apache.sling.api.resource.ResourceResolverFactory;
    import org.json.JSONObject;
    import org.osgi.service.component.annotations.Component;
    import org.osgi.service.component.annotations.Reference;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import com.day.cq.dam.api.Asset;
    import com.day.cq.dam.api.AssetManager;
    
    @Component(service = AssetUploadAPIService.class)
    public class AssetUploadAPIServiceImpl implements AssetUploadAPIService {
    
        @Reference
        transient ResourceResolverFactory resolverFactory;
    
        private transient Map<String, Object> param = new HashMap<>();
    
        private static final Logger LOGGER = LoggerFactory.getLogger(AssetUploadAPIServiceImpl.class);
        
        public AssetUploadAPIServiceImpl() {
             param.put(ResourceResolverFactory.SUBSERVICE, "datawrite");
        }
    
        private ResourceResolver getResourceResolver() throws LoginException {
            return resolverFactory.getServiceResourceResolver(param);
        }
    
        @Override
        public ServletResponse<String> getAssetUploadResponse(SlingHttpServletRequest request) {
            try (ResourceResolver resourceResolver = getResourceResolver()) {
                StringBuilder sb = new StringBuilder();
                BufferedReader reader = request.getReader();
                try {
                    String line = null;
                    while ((line = reader.readLine()) != null) {
                        sb.append(line);
                    }
                } finally {
                    reader.close();
                }
    
                LOGGER.info("POST JSON data: {}", sb);
                JSONObject jsonObject = new JSONObject(sb.toString());
                String assetPath = jsonObject.getString("assetPath");
                String mimeType = jsonObject.getString("mimeType");
                String encoding = jsonObject.getString("encoding");
                String asset = jsonObject.getString("asset");
                String imageType = mimeType.split("/")[1];
    
                LOGGER.info("assetPath: {}, mimeType: {}, encoding: {}, asset: {}, imageType: {}", assetPath, mimeType,encoding, asset, imageType);
    
                InputStream targetStream = new ByteArrayInputStream(Base64.getDecoder().decode(asset.getBytes(StandardCharsets.UTF_8)));
    
                AssetManager assetManager = resourceResolver.adaptTo(AssetManager.class);
                Asset imageAsset = assetManager.createAsset((assetPath + "." + imageType), targetStream, mimeType, true);
                return new ServletResponse<>(ServletResponse.ServletResponseType.RES_200, imageAsset.getPath());
            } 
            catch (Exception e) {
                LOGGER.error(String.format("There was an Error  === " + e));
                return new ServletResponse<>(ServletResponse.ServletResponseType.RES_400, e.getMessage());
            }
        }
    
    }
    

    对于这个Java类,我在下面编写了JUNIT测试用例

    import static org.junit.jupiter.api.Assertions.assertEquals;
    import static org.junit.jupiter.api.Assertions.assertNull;
    import static org.mockito.ArgumentMatchers.any;
    import static org.mockito.Mockito.mock;
    import static org.mockito.Mockito.when;
    
    import java.util.HashMap;
    
    import javax.jcr.Session;
    
    import org.apache.sling.api.SlingHttpServletRequest;
    import org.apache.sling.api.resource.LoginException;
    import org.apache.sling.api.resource.ResourceResolver;
    import org.apache.sling.api.resource.ResourceResolverFactory;
    import org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper;
    import org.apache.sling.testing.mock.sling.ResourceResolverType;
    import org.json.JSONException;
    import org.junit.Rule;
    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 com.day.cq.wcm.foundation.forms.FormsHandlingRequest;
    
    import io.wcm.testing.mock.aem.junit5.AemContext;
    
    class AssetUploadAPIServiceImplTest {
    
        @Mock
        private ResourceResolverFactory resolverFactory;
    
        @Mock
        private Session session;
    
        @Mock
        private ResourceResolver resourceResolver;
    
        @Rule
        private final AemContext context = new AemContext(ResourceResolverType.JCR_MOCK);
    
        @InjectMocks
        private AssetUploadAPIServiceImpl assetUploadAPIService = new AssetUploadAPIServiceImpl();
    
        @BeforeEach
        public void setup() {
            MockitoAnnotations.initMocks(this);
            HashMap<String, Object> parameterMap = new HashMap<>();
            parameterMap.put("assetPath", "/content/dam/public/assets");
            parameterMap.put("mimeType", "image/png");
            parameterMap.put("encoding", "base64");
            context.request().setParameterMap(parameterMap);
        }
    
        @Test
        void getAssetUploadResponse() throws LoginException, JSONException {
            when(resolverFactory.getServiceResourceResolver(any())).thenReturn(resourceResolver);
            when(resourceResolver.adaptTo(Session.class)).thenReturn(session);
            ServletResponse<String> actualAssetUploadResponse = assetUploadAPIService.getAssetUploadResponse(new FormsHandlingRequest(new SlingHttpServletRequestWrapper(mock(SlingHttpServletRequest.class))));
            assertNull(actualAssetUploadResponse.getPayload());
            assertEquals(ServletResponse.ServletResponseType.RES_400, actualAssetUploadResponse.getStatus());
        }
    
    }
    
    

    但是我的测试覆盖率是50%,而且它仍然表明我还没有覆盖下面的jsonobject

    JSONObject jsonObject = new JSONObject(sb.toString());
                String assetPath = jsonObject.getString("assetPath");
                String mimeType = jsonObject.getString("mimeType");
                String encoding = jsonObject.getString("encoding");
                String asset = jsonObject.getString("asset");
                String imageType = mimeType.split("/")[1];
    
    

    这里有我遗漏的东西吗。请提出建议。

    我已经在我的JUNIT测试类中更新了下面的内容,但仍然获得了50%的代码覆盖率。

    JSONObject jsonObject = new JSONObject(sb.toString());
                String assetPath = jsonObject.getString("assetPath");
                String mimeType = jsonObject.getString("mimeType");
                String encoding = jsonObject.getString("encoding");
                String asset = jsonObject.getString("asset");
                String imageType = mimeType.split("/")[1];
    
    0 回复  |  直到 2 年前