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

单元测试方法在运行测试时不使用模拟对象。而是调用实际的类和方法

  •  0
  • Andulos  · 技术社区  · 6 年前

    我要测试一个名为class to test的类。它调用一个云服务来上传文件。

    public class ClassToTest {
        public String moveFilesToCloud(String path, String documentclass, String objStore) {
            log.info("Moving files to cloud.");
            String docId = StringUtils.EMPTY;
            CloudService service = new CloudService();
            try {
                docId = service.uploadDocument(path,documentclass,objStore,"");
            } catch (CloudException e) {
                log.info("* Error uploading reports to cloud *" + e.getMessage());
            }
            return docId;
        }
    }
    

    下面是测试类。测试类有一个CloudService的模拟对象。当我运行测试而不是获取模拟对象时,实际的CloudService将被执行并失败。

    @Mock
    CloudService cloudService;
    
    @InjectMocks
    ClassToTest classToTest;
    
    @Test
    public void testMoveFilesToCloud() throws Exception {
        String pass = "pass";
        when(cloudService.uploadDocument("abc","def","ghi","")).thenReturn(pass);
    
        String result = classToTest.moveFilesToCloud("abc","def","ghi");
    
        assertEquals(result,pass);
    }
    

    我希望在执行此行时使用CloudService的模拟对象-

    相反,它实际上是在尝试创建一个新的CloudService实例。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Willem    6 年前

    尝试使用依赖注入。使CloudService成为ClassToTest的一个字段。更改ClassToTest的构造函数以接受CloudService。然后Mockito可以在单元测试中将mock注入ClassToTest。

    public class ClassToTest {
    
        private CloudService service;
    
        public ClassToTest(CloudService service) {
            this.service = service;
        }
    
        public String moveFilesToCloud(String path, String documentclass, String objStore) {
            log.info("Moving files to cloud.");
            String docId = StringUtils.EMPTY;
            try {
                docId = service.uploadDocument(path,documentclass,objStore,"");
            } catch (CloudException e) {
                log.info("* Error uploading reports to cloud *" + e.getMessage());
            }
            return docId;
        }
    }
    
        2
  •  0
  •   Renato    6 年前

    如果你用过注射,那么 @RunWith(MockitoJUnitRunner.class) 本来是有用的,但事实并非如此。

    PowerMockito 以便在调用构造函数时修改字节码并生成模拟。 This can help you