使用 Mockito/PowerMockito 来模拟超类的公共方法



Mockito/PowerMockito中是否有任何模拟超类的一些方法。

下面是一个场景,它执行多级继承。

public class Network {
public String getNetwork() {
return "Technology";
}
}

这是另一个扩展Network的类Technology

public class Technology extends Network {
public Type getTechnology() {
String network = getNetwork();
if(network == null){
return null;
}
return network;
}
}

另一个类Service扩展Technology

public class BaseService extends Technology {
public void getServices() {
Type type = getTechnology();
if(type == null){
throw new Exception('Type not found');
}
}
}

我想为 BaseService 类方法getServices编写一个测试用例,以便在技术类Type为 null 时它应该抛出异常。

我已经尝试了几个步骤,但无能为力。

编写的示例测试用例

@Test
public void test_get_services_should_throw__exception_when_type_is_null() throws Exception{
//Arrange
expectedException.expect(Exception.class);
baseService = Mockito.mock(BaseService.class, Mockito.CALLS_REAL_METHODS);
when(baseService.getTechnology()).thenReturn(null);

//Act
baseService.getServices();
}

上面的代码片段只是一个示例,可能包含错误。如果有的话,请忽略。

请帮助我解决此问题。

提前谢谢。

这应该有效。

@RunWith(MockitoJUnitRunner.class)
public class TestInheritance {
@Spy
BaseService baseService;
@Rule
public final ExpectedException expectedException = ExpectedException.none();
@Test
public void test_get_services_should_throw__exception_when_type_is_null() throws Exception{
expectedException.expect(Exception.class);
when(baseService.getTechnology()).thenReturn(null);
baseService.getServices();
}
}

使用spy对象。在这里baseService会是一个间谍。

您可以在spy对象上添加行为,就像添加mock行为一样。

我给你一个小小的开端——

baseService = Mockito.spy(new BaseService());

顺便说一句,如果您更喜欢组合而不是继承,您就不会看到这个问题。

正如其他人已经写过的那样,你可以用间谍来做到这一点,但我建议用不同的方法来测试你的测试。

在非常简单的示例中,所有null-check 都是无关紧要的,因为您始终返回一个常量、非空值。在那种特殊情况下,嘲笑根本没有意义。

但鉴于您的基类实际上可能具有不同的返回值。与其嘲笑父级的方法,不如以这种方式编写测试,通过改变类的"状态"(类状态或全局状态,如环境(前提条件来触发替代路径。 通过这种方式,您创造了父母行为不同的实际情况。

这将创建一个对更改(由于重构(更加健壮的测试设置,并进一步提供第一种形式的集成测试,因为您正在测试您的专用类是否集成。 与父类。

以严格隔离的单元测试为目标可能会导致测试套件无法正确涵盖类之间的协作。严格隔离的测试可能构成自动化测试方法的基础,但您应该在此基础上进行具有一定程度集成的测试(此处不是指与外部服务集成的"真实"集成测试(。

我的建议是,仅在明确定义的边界(接口(上使用模拟,并尽可能多地使用真实类,并相应地设计测试(不是训练模拟,而是准备先决条件(。

相关内容

  • 没有找到相关文章

最新更新