模拟不能模拟方法调用

时间:2017-03-29 17:43:15

标签: java testing junit mockito

我试图在我的测试中模拟一个调用,但是我收到一个错误,因为它调用真正的方法而不是模拟它。

这是我的方法

@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,并在设置代理时失败。帮助我理解我在这里做错了什么。

2 个答案:

答案 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