我试图在测试中模拟一个调用,但我得到了一个错误,因为它调用了真正的方法,而不是模拟它。
这是我的方法
@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)));
}
测试实际上调用了受保护的方法config Setter,并在设置代理时失败。帮助我理解我在这里做错了什么。
尝试使用powerMockito返回AmazonEC2
@RunWith(PowerMockRunner.class)
@PrepareForTest({AwsConfigurationLocal.class})//assuming this is your test class
@InjectMocks
private AwsConfigurationLocal subject=PowerMockito.spy(AwsConfigurationLocal.class);//or try Mockito.spy instead, whichever works
@Test
public void TestgetAllSecurityGroups() throws Exception {
ec2 = Mockito.mock(AmazonEC2Client.class);
PowerMockito.doReturn(ec2).when(subject).configSetter().withNoArguments();
//your code
}
主题。getAllSecurityGroups()
调用realconfigSetter()
返回realAmazonEC2
,然后将其传递给awsService。GetAllSecurityGroup(ec2)
。该参数与mock
ec2
不匹配,因此默认的mock实现将作为实际的
返回(我猜它是空的)。
所以问题是:没有任何东西会阻止调用
configSetter()
的真正实现。如果你用@Spy
注释主题
,然后
Mockito.when(subject.configSetter()).then(ec2);
它应该像预期的那样工作。
也就是说,有很多设置只是为了检查委托的简单调用。这是由于
AwsConfigurationlocal
中的两个职责混合在一起——创建Amazon EC2Client
并提供getAllSecurityGroup()
。如果您将前者移动到单独的类中(比如Amazon EC2ClientFactor
),那么一切都应该就位。
上面还有第二个问题。当我在Expects块中定义mock类时(如上),似乎只调用了构造函数,而不是,因此没有正确初始化对象。我通过将它移到方法中并在那里实例化该类来解决这个问题。看起来是这样的: 因此,这似乎得到了要调用的正确构造函数,但似乎还在调用。有什么见解吗?
异常堆栈跟踪
我试图为一个类编写一个单元测试,这个类使用带有库中的的Google vision API。问题是,由于某种原因,我的模拟仍然调用真正的方法,然后抛出一个NPE,这破坏了我的测试。我以前从未在模拟上见过这种行为,我想知道我是不是做错了什么,是不是Spock/Groovy中有bug,还是与Google lib有关?
我正在使用TestNG编写单元测试。问题是当我模拟System.CurrentTimeMillis时,它返回的是实际值,而不是模拟的值。理想情况下,它应该返回0L,但它返回的是实际值。我该怎么做才能继续?
在安装到AEM 5.6.1实例之前,我正在使用maven构建和测试我的代码。我已经编写了单元测试,这些测试使用wcm的实现从aem模拟中获益。io和其他需要使用powermockito模拟静态方法的单元测试。 以下是我对aem上下文、sling Mock和powermock的maven依赖关系。 在我的课堂上,我正在为aem上下文设置规则,并准备一些用于模拟的静态类: 当我通过命令行运行mvn测试
有人能帮帮我吗?提前谢了。