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



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

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;
}
}

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

@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);
}

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

云服务服务 = 新的云服务((;

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

我哪里出错了?

尝试使用依赖注入。使云服务成为ClassToTest的一个领域。更改 ClassToTest 的构造函数以接受云服务。然后,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;
}
}

这是行不通的。

如果您使用过注射,那么添加@RunWith(MockitoJUnitRunner.class)会很有用,但事实并非如此。

如果可以使用 Injection,那就这样做,否则您必须使用PowerMockito来修改字节码并在调用构造函数时生成模拟。这可以帮助您

最新更新