【问题标题】:Unit test method does not use the mocked object when running the test. Instead calls the actual class and method单元测试方法在运行测试时不使用模拟对象。而是调用实际的类和方法
【发布时间】:2020-05-17 14:08:31
【问题描述】:

我有一个名为 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 服务 = new CloudService();

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

我哪里错了?

【问题讨论】:

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

标签: java unit-testing testing junit mockito


【解决方案1】:

尝试使用依赖注入。使 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;
    }
}

【讨论】:

    【解决方案2】:

    这行不通。

    如果您使用了注入,那么添加 @RunWith(MockitoJUnitRunner.class) 会很有用,但它不是。

    如果您可以使用注入,那么就这样做,否则您必须使用PowerMockito 以便在调用构造函数时修改字节码并生成模拟。 This can help you

    【讨论】:

    • 链接中的相关部分是 PowerMockito 的 whenNew 功能与 PrepareForTest 注释的正确用法相结合。
    猜你喜欢
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多