我需要执行从Micronaut到Spring应用程序的远程调用。为了创建必要的bean,我创建了一个工厂:
@Factory
public class RemotingConfig {
@Bean
@Singleton
public OfferLeadService offerLeadService(@Value("${offer.server.remoting.base.url}")
String offerRemotingBaseUrl) {
HttpInvokerProxyFactoryBean invoker = new HttpInvokerProxyFactoryBean();
invoker.setHttpInvokerRequestExecutor(new SimpleHttpInvokerRequestExecutor());
invoker.setServiceUrl(offerRemotingBaseUrl + OfferLeadService.URI);
invoker.setServiceInterface(OfferLeadService.class);
invoker.afterPropertiesSet();
return (OfferLeadService) invoker.getObject();
}
@Bean
@Singleton
public APIKeyService apiKeyService(@Value("${offer.server.remoting.base.url}")
String offerRemotingBaseUrl) {
HttpInvokerProxyFactoryBean invoker = new HttpInvokerProxyFactoryBean();
invoker.setHttpInvokerRequestExecutor(new SimpleHttpInvokerRequestExecutor());
invoker.setServiceUrl(offerRemotingBaseUrl + APIKeyService.URI);
invoker.setServiceInterface(APIKeyService.class);
invoker.afterPropertiesSet();
return (APIKeyService) invoker.getObject();
}
}
在我的Spock集成测试中,我需要模拟这些bean,我根据Micronaut文档进行了尝试:https://docs.micronaut.io/latest/guide/index.html#replaces
这导致了这样的测试:
@MicronautTest
class StackoverflowSpecification extends Specification {
@Inject
AuthorizedClient authorizedClient
@Inject
UnauthorizedClient unauthorizedClient
@Inject
OfferLeadService offerLeadService
@Inject
APIKeyService apiKeyService
@Factory
@Replaces(factory = RemotingConfig.class)
static class RemotingConfigTest extends Specification {
@Singleton
OfferLeadService offerLeadService() {
return Mock(OfferLeadService)
}
@Singleton
APIKeyService apiKeyService() {
return Mock(APIKeyService)
}
}
void "authenticated sessions request returns 200 ok"() {
when:
HttpResponse response = authorizedClient.getSession("AA-BB-CC")
then:
response.status == OK
and: 'setup mock calls'
1 * apiKeyService.find(_, _) >> buildApiKeyVO()
1 * offerLeadService.containsHipHavingPostalCode(_, _) >> true
0 * _
}
void "authenticated sessions request with wrong passphrase returns 403 forbidden"() {
when:
unauthorizedClient.getSessionWithWrongPassphrase("AA-BB-CC")
then:
HttpClientResponseException ex = thrown(HttpClientResponseException)
then:
ex.status == FORBIDDEN
and: 'setup mock calls'
1 * apiKeyService.find(_, _) >> buildApiKeyVO()
1 * offerLeadService.containsHipHavingPostalCode(_, _) >> false
0 * _
}
private static APIKeyVO buildApiKeyVO() {
APIKeyVO key = new APIKeyVO()
key.setId(1L)
key.setValue("123")
key.setEnabled(true)
key.setRoles(List.of("ROLE_STANDARD"))
key.setValidUntil(Instant.now().plus(100, ChronoUnit.DAYS))
key.setDescription("CBC App")
key.setAccountId("CBC")
return key
}
}
这个解决方案效果不佳。如果这两个测试是单独运行的,那么这两个测试都会通过,但是,这会导致第二个测试失败(这里的顺序是相关的,因此如果第二个测试在顶部,那么它将是通过的)。
在运行两个测试和调试时,我看到,一旦在第一个测试中按预期调用了两个mock,那么对mock的所有后续调用将分别导致null
和false
,尽管指定了其他内容。
如何模拟集成测试中通过RemotingConfig
指定的两个bean?
您没有正确使用@替换
注释。
factory
成员不是为了自己使用,而是为了进一步限定被替换的类型。
@Factory
static class RemotingConfigTest extends Specification {
@Singleton
@Replaces(bean = OfferLeadService.class, factory = RemotingConfig.class)
OfferLeadService offerLeadService() {
return Mock(OfferLeadService)
}
@Singleton
@Replaces(bean = APIKeyService.class, factory = RemotingConfig.class)
APIKeyService apiKeyService() {
return Mock(APIKeyService)
}
}
编辑:以上仍然适用,但是您希望在测试执行之间重置模拟。以上代码不会发生这种情况。您需要使用
@MockBean
注释,它是micronaut测试的一部分。
@MockBean(OfferLeadService.class)
OfferLeadService offerLeadService() {
return Mock(OfferLeadService)
}
@MockBean(APIKeyService.class)
APIKeyService apiKeyService() {
return Mock(APIKeyService)
}
下面是我的Spock单元测试: 下面是mock: 当我运行此命令时,我得到: 它在第18行引用的空对象要么是,要么是它的映射。为什么啊?
虽然这个问题已经得到了回答,但我仍然不清楚在嘲弄中应该使用哪一个 当参考。我看不出它们之间有什么区别。 留档为是说 的文档中说 的留档是说 这清楚地表明,这两者之间没有区别。那么,我们为什么要采用这三种嘲弄策略,以及在当时和何时使用它们之间的具体区别。 如果它是一个带有示例代码的答案,那将非常有帮助。
我在spock和groovy的初始阶段,我试图测试一个简单的Spring启动应用程序,并获得 下面是我的java和groovy代码以及异常详细信息 TestController.java TestControllerSpec。棒极了 我确信我的代码遗漏了什么
我有一个关于SPOCK+Drools测试的问题。事情是这样的, 我正在部署的webapp W/O中运行测试(如果这有任何意义的话:))。我将jar添加到类路径中(而不是WEB-INF/libs),现在运行良好。
我尝试为API控制器编写UnitTest,它使用来自micronaut-data-jpa的CrudRepository。我使用@mockbean来模拟控制器中的协作存储库。如果我运行测试,我会得到以下错误: 没有这样的方法[findById(java.lang.object)] 我从未使用过Spock、Micronaut-Data或Micronaut-Test,只从以下来源尝试过: https:/
我想探听Spring Bean的方法调用。我检查了Docs-Spock只能通过构造函数创建间谍。Spock可以用间谍包裹已经存在的物体吗?