温馨提示:本文翻译自stackoverflow.com,查看原文请点击:java - Unit test method does not use the mocked object when running the test. Instead calls the actual clas
java junit mockito testing unit-testing

java - 单元测试方法在运行测试时不使用模拟对象。

发布于 2020-04-08 10:29:51

我有一个名为ClassToTest的测试类。它调用CloudService来上传文件。

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服务=新的CloudService();

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

我在哪里错了?

查看更多

提问者
Keerthi
被浏览
76
Willem 2020-02-01 06:07

尝试使用依赖注入。使CloudService成为ClassToTest的字段。更改ClassToTest的构造函数以接受CloudService。然后Mockito可以在单元测试中将模拟注入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;
    }
}