我试图在我的测试中模拟一个调用,但是我收到一个错误,因为它调用真正的方法而不是模拟它。
这是我的方法
@Value("${omega.aws.nonprod-profile}")
private String nonProdProfile;
@Autowired
AwsService awsService;
public List<SecurityGroup> getAllSecurityGroups() {
AmazonEC2 ec2 = configSetter();
return awsService.getAllSecurityGroups(ec2);
}
protected AmazonEC2 configSetter() {
ProfileCredentialsProvider credentials = new ProfileCredentialsProvider(nonProdProfile);
ClientConfiguration clientCfg = new ClientConfiguration();
clientCfg.setProxyHost(this.proxyHost);
clientCfg.setProxyPort(Integer.valueOf(proxyPort));
clientCfg.setProtocol(Protocol.HTTPS);
return new AmazonEC2Client(credentials, clientCfg);
}
这是我的测试类
@InjectMocks
private AwsConfigurationLocal subject;
@Mock
private AwsService awsService;
@Test
public void TestgetAllSecurityGroups() throws Exception {
ec2 = Mockito.mock(AmazonEC2Client.class);
securityGroup = new SecurityGroup();
List<SecurityGroup> result = Collections.singletonList(securityGroup);
Mockito.when(awsService.getAllSecurityGroups(ec2)).thenReturn(result);
List<SecurityGroup> actual = subject.getAllSecurityGroups();
assertThat(actual, CoreMatchers.is(equals(result)));
}
测试实际上调用受保护的方法configSetter,并在设置代理时失败。帮助我理解我在这里做错了什么。
答案 0 :(得分:0)
subject.getAllSecurityGroups();
调用真实configSetter()
,返回真实AmazonEC2
,然后传递给awsService.getAllSecurityGroups(ec2);
。该参数与模拟ec2
不匹配,因此返回默认模拟实现(我猜它为空)为actual
。
所以问题是:没有什么可以阻止调用configSetter()
的实际实现。
如果您使用subject
注释@Spy
并执行
Mockito.when(subject.configSetter()).then(ec2);
它应该按预期工作。
有人说,为了检查被委派的简单调用,已经进行了很多设置。这是因为AwsConfigurationLocal
中的两项责任的混合 - AmazonEC2Client
的创建和getAllSecurityGroups()
的提交。如果你把前者移到另一个班级(让我们说AmazonEC2ClientFactor
),一切都应该落实到位。
答案 1 :(得分:0)
尝试使用powerMockito返回ouble Triangle::getHeight() const
{
return height;
}
AmazonEC2