github-actions[bot] on gh-pages
Publish docs/2.2-SNAPSHOT (compare)
github-actions[bot] on gh-pages
Publish javadoc/2.2-SNAPSHOT (compare)
leonard84 on master
Add docs for `@Tag` (compare)
Hi all, I'm having troubles with additionalInterfaces
. Using 2.1-M2
. I don't understand why this doesn't call the method foo
:
class A {}
class B {}
interface C { B foo() }
...
def a = Stub(A, additionalInterfaces: [C]) {
foo() >> { println 2; new B() }
}
println(a instanceof C)
def b = a.foo()
println b.getClass()
This prints true
and then class java.lang.Object
. 2
is not printed. Why isn't this calling my stubbed method?!
additionalInterfaces
where the method is called and I return a nice value but I get a NPE in org.spockframework.gentyref.GenericTypeReflector:73
- java.lang.NullPointerException: Cannot invoke "Object.getClass()" because "type" is null
.
Hello Every one.. We are using spock core version 1.3-groovy-2.5 version and running few of our SpringBootTest using EmbeddedSpecRunner.groovy with RunListeners.
EmbeddedSpecRunner runner = new EmbeddedSpecRunner();
runner.setListeners(Collections.singletonList(new TextListener(System.out)));
When we are upgrading to 2.1-M2-groovy-3.0, we are seeing setListeners are not available ! also seeing in the source code, listener array variable got removed in the commit 693832c3cfaeebf349025002561acc556d7dbcae
Now how to add any run listener with EmbeddedSpecRunner ?
Hi, I am getting a weird issue with Spock where as soon as I declare throws
in my then:
block, the test starts to fail with a NullPointerException.
If I remove the throws
assertion, the test fails with the expected (UnsupportedOperationException) exception as it should.
throws
special handling, but without any sample code I can't help you. You can however use https://gwc-experiment.appspot.com/ to look at the AST to see the transformed code and where the issue is.
callRealMethod()
- my IDE can't locate it and I can't see any import statements in the documentation...can someone point me to where the method lives?
Hi! I'm trying to bump Spring Cloud Contract to use latest Boot 3.0.0 and Framework 6.0.0. So all of my Spock Spring tests are failing because NPEs. That means that the tests have not had their Spring Context registered. I've started to debug things and apparently org.spockframework.spring.SpringExtension#isSpringSpec
returns false
now. So I've added temporarily the @ContextConfiguration
annotation to make that method return true
. I've started getting more problematic exceptions like this one
2022-01-21 11:05:46.899 ERROR 67468 --- [ main] o.s.boot.SpringApplication : Application run failed
java.lang.NoClassDefFoundError: org/springframework/beans/factory/config/InstantiationAwareBeanPostProcessorAdapter
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1012)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
at org.spockframework.spring.mock.SpockContextCustomizer.customizeContext(SpockContextCustomizer.java:43)
at org.springframework.boot.test.context.SpringBootContextLoader$ContextCustomizerAdapter.initialize(SpringBootContextLoader.java:294)
at org.springframework.boot.SpringApplication.applyInitializers(SpringApplication.java:599)
at org.springframework.boot.SpringApplication.prepareContext(SpringApplication.java:367)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:301)
at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:124)
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98)
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:123)
at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:124)
at org.springframework.cloud.contract.wiremock.WireMockTestExecutionListener.applicationContextBroken(WireMockTestExecutionListener.java:120)
at org.springframework.cloud.contract.wiremock.WireMockTestExecutionListener.beforeTestClass(WireMockTestExecutionListener.java:43)
at org.springframework.test.context.TestContextManager.beforeTestClass(TestContextManager.java:213)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
As for this particular problem this is Spring's corresponding issue spring-projects/spring-framework#25165 . Anyways, the question is has anyone checked it there's a way to make Spcok + JUnit5 + Spring Framework 6 work together?
Hi all!
I'm upgrading Spock to v2 and there are tests that use JUnit 4 rules, so I've added the "JUnit 4 Module". One of the rules in use is TempusFugit's @Repeating
, which internally evaluates JUnit's Statement
multiple times. This results in an error in Spock:
java.util.NoSuchElementException
at java.base/java.util.LinkedList.removeFirst(LinkedList.java:274)
at org.spockframework.mock.runtime.MockController.leaveScope(MockController.java:76)
I wrote an extension that tries to do invocation.proceed()
twice and I get the same error. Is this the expected behavior? I read somewhere that spec instances can only be used once... so I guess that's related?
If the above is by design, what would be an approach to implement something like TempusFugit's @Repeating
/ @Concurrent
rules using "pure" Spock? Thanks in advance!
@Concurrent
we'll probably have to write ourselves.. that didn't work on Spock anyway, as far as I know...
hello
I have this code to test
app = Optional.ofNullable(receiverCompany.getApplication()).orElse(getDefaultApp());
and my test is
given:
def application = new GenericApp()
def receiverCompanyDTO = new ReceiverCompanyDTO(
application: application
)
ApplicationService applicationService = new ApplicationServiceImpl( Mock (ApplicationsDAO))
when:
def result= applicationService.getByReceiverCompany(receiverCompanyDTO)
then:
result != null
always enters through orElse , I don’t know how to make for that the variable app to have the value of receiverCompanyDTO
Can we help me with this issue?
Thanks a lot
:point_up: Edit: hello
I have this code to test
app = Optional.ofNullable(receiverCompany.getApplication()).orElse(getDefaultApp());
and my test is
given:
def application = new GenericApp()
def receiverCompanyDTO = new ReceiverCompanyDTO(
application: application
)
ApplicationService applicationService = new ApplicationServiceImpl( Mock (ApplicationsDAO))
when:
def result= applicationService.getByReceiverCompany(receiverCompanyDTO)
then:
result != null
always enters through orElse , I don’t know how to make for that the variable app to have the value of receiverCompanyDTO
Can we help me with this issue?
Thanks a lot
:point_up: Edit: hello
I have this code to test
app = Optional.ofNullable(receiverCompany.getApplication()).orElse(getDefaultApp());
and my test is
given:
def application = new GenericApp()
def receiverCompanyDTO = new ReceiverCompanyDTO(
application: application
)
ApplicationService applicationService = new ApplicationServiceImpl( Mock (ApplicationsDAO))
when:
def result= applicationService.getByReceiverCompany(receiverCompanyDTO)
then:
result != null
always enters through orElse , I don’t know how to make for that the variable app to have the value of receiverCompanyDTO
Can we help me with this issue?
Thanks a lot
:point_up: Edit: hello
I have this code to test
Where public class GenericApp extends Application {app = Optional.ofNullable(receiverCompany.getApplication()).orElse(getDefaultApp());
and my test is
given:
def application = new GenericApp()
def receiverCompanyDTO = new ReceiverCompanyDTO(
application: application
)
ApplicationService applicationService = new ApplicationServiceImpl( Mock (ApplicationsDAO))
when:
def result= applicationService.getByReceiverCompany(receiverCompanyDTO)
then:
result != null
always enters through orElse , I don’t know how to make for that the variable app to have the value of receiverCompanyDTO
Can we help me with this issue?
Thanks a lot
:point_up: Edit: hello
I have this code to test
Where public class GenericApp extends Application {
.......
}
@Override
public Application getByReceiverCompany(final ReceiverCompanyDTO receiverCompany) {
final Application app = Optional.ofNullable(receiverCompany).map(ReceiverCompanyDTO::getApplication)
.orElse(getDefaultApp());
return app;
}
and my test is
given:
def application = new GenericApp()
def receiverCompanyDTO = new ReceiverCompanyDTO(
application: application
)
ApplicationService applicationService = new ApplicationServiceImpl( Mock (ApplicationsDAO))
when:
def result= applicationService.getByReceiverCompany(receiverCompanyDTO)
then:
result != null
always enters through orElse , I don’t know how to make for that the variable app to have the value of receiverCompanyDTO
Can we help me with this issue?
Thanks a lot
:point_up: Edit: hello
I have this code to test
Where public class GenericApp extends Application {
.......
}
public class ApplicationService {
@Override
public Application getByReceiverCompany(final ReceiverCompanyDTO receiverCompany) {
final Application app = Optional.ofNullable(receiverCompany).map(ReceiverCompanyDTO::getApplication)
.orElse(getDefaultApp());
return app;
}
}
and my test is
given:
def application = new GenericApp()
def receiverCompanyDTO = new ReceiverCompanyDTO(
application: application
)
ApplicationService applicationService = new ApplicationServiceImpl( Mock (ApplicationsDAO))
when:
def result= applicationService.getByReceiverCompany(receiverCompanyDTO)
then:
result != null
always enters through orElse , I don’t know to make for that the variable app to have the value of receiverCompanyDTO
Can we help me with this issue?
Thanks a lot
:point_up: Edit: hello
I have this code to test
Where
public class GenericApp extends Application {
}
public class ApplicationService {
@Override
public Application getByReceiverCompany(final ReceiverCompanyDTO receiverCompany) {
final Application app = Optional.ofNullable(receiverCompany).map(ReceiverCompanyDTO::getApplication)
.orElse(getDefaultApp());
return app;
}
}
and my test is
class ApplicationServiceSpec extends Specification {
def 'getByReceiverCompany ReceiverCompanyDTO -> application is not null'() {
given:
def application = new GenericApp()
def receiverCompanyDTO = new ReceiverCompanyDTO(
application: application
)
ApplicationService applicationService = new ApplicationServiceImpl( Mock (ApplicationsDAO))
when:
def result= applicationService.getByReceiverCompany(receiverCompanyDTO)
then:
result != null
}
}
```
always enters through orElse , I don’t know to make for that the variable app to have the value of receiverCompanyDTO
Can we help me with this issue?
Thanks a lot
:point_up: Edit: hello
I have this code to test
Where
public class GenericApp extends Application {
}
public class ApplicationService {
@Override
public Application getByReceiverCompany(final ReceiverCompanyDTO receiverCompany) {
final Application app = Optional.ofNullable(receiverCompany).map(ReceiverCompanyDTO::getApplication)
.orElse(getDefaultApp());
return app;
}
}
and my test is
class ApplicationServiceSpec extends Specification {
def 'getByReceiverCompany ReceiverCompanyDTO -> application is not null'() {
given:
def application = new GenericApp()
def receiverCompanyDTO = new ReceiverCompanyDTO(
application: application
)
ApplicationService applicationService = new ApplicationServiceImpl( Mock (ApplicationsDAO))
when:
def result= applicationService.getByReceiverCompany(receiverCompanyDTO)
then:
result != null
}
}
```
always enters through orElse , I don’t know to make for that the variable app to have the value of receiverCompanyDTO
Can we help me with this issue?
Thanks a lot
:point_up: Edit: hello
I have this code to test
Where
public class GenericApp extends Application {
}
public class ApplicationService {
@Override
public Application getByReceiverCompany(final ReceiverCompanyDTO receiverCompany) {
final Application app = Optional.ofNullable(receiverCompany).map(ReceiverCompanyDTO::getApplication)
.orElse(getDefaultApp());
return app;
}
}
and my test is
class ApplicationServiceSpec extends Specification {
def 'getByReceiverCompany ReceiverCompanyDTO -> application is not null'() {
given:
def application = new GenericApp()
def receiverCompanyDTO = new ReceiverCompanyDTO(
application: application
)
ApplicationService applicationService = new ApplicationServiceImpl( Mock (ApplicationsDAO))
when:
def result= applicationService.getByReceiverCompany(receiverCompanyDTO)
then:
result != null
}
}
always enters through orElse , I don’t know to make for that the variable app to have the value of receiverCompanyDTO
Can we help me with this issue?
Thanks a lot
ApplicationService
seems to override something, but does not implement any interfaces or extend another class. What is missing there?ReceiverCompanyDTO
, ApplicationServiceImpl
and ApplicationsDAO
? Without them, the example does not compile.GenericApp extends Application
, but Application
is missing.:point_up: Edit: hello
I have this code to test
Where
public class GenericApp extends Application {
}
public class ApplicationService {
public Application getByReceiverCompany(final ReceiverCompanyDTO receiverCompany) {
final Application app = Optional.ofNullable(receiverCompany).map(ReceiverCompanyDTO::getApplication)
.orElse(getDefaultApp());
return app;
}
}
and my test is
class ApplicationServiceSpec extends Specification {
def 'getByReceiverCompany ReceiverCompanyDTO -> application is not null'() {
given:
def application = new GenericApp()
def receiverCompanyDTO = new ReceiverCompanyDTO(
application: application
)
ApplicationService applicationService = new ApplicationServiceImpl( Mock (ApplicationsDAO))
when:
def result= applicationService.getByReceiverCompany(receiverCompanyDTO)
then:
result != null
}
}
always enters through orElse , I don’t know to make for that the variable app to have the value of receiverCompanyDTO
Can we help me with this issue?
Thanks a lot
Share as Link
button to share your example here.
:point_up: Edit: hello
I have this code to test
Where
public class GenericApp extends Application {
}
public class ReceiverCompanyDTO {
Application application;
public Application getApplication() {
return application;
}
public void setApplication(Application application) {
this.application = application;
}
}
public interface ApplicationsDAO {
}
public interface ApplicationService {
Application getByReceiverCompany(ReceiverCompanyDTO receiverCompany);
}
public class ApplicationService implements ApplicationService{
private final ApplicationsDAO applicationDao;
public ApplicationServiceImpl(final ApplicationsDAO applicationDao) {
this.applicationDao = applicationDao;
}
@Override
public Application getByReceiverCompany(final ReceiverCompanyDTO receiverCompany) {
final Application app = Optional.ofNullable(receiverCompany).map(ReceiverCompanyDTO::getApplication)
.orElse(getDefaultApp());
return app;
}
}
and my test is
class ApplicationServiceSpec extends Specification {
def 'getByReceiverCompany ReceiverCompanyDTO -> application is not null'() {
given:
def application = new GenericApp()
def receiverCompanyDTO = new ReceiverCompanyDTO(
application: application
)
ApplicationService applicationService = new ApplicationServiceImpl( Mock (ApplicationsDAO))
when:
def result= applicationService.getByReceiverCompany(receiverCompanyDTO)
then:
result != null
}
}
always enters through orElse , I don’t know to make for that the variable app to have the value of receiverCompanyDTO
Can we help me with this issue?
Thanks a lot
:point_up: Edit: hello
I have this code to test
Where
public class Application {
}
public class GenericApp extends Application {
}
public class ReceiverCompanyDTO {
Application application;
public Application getApplication() {
return application;
}
public void setApplication(Application application) {
this.application = application;
}
}
public interface ApplicationsDAO {
}
public interface ApplicationService {
Application getByReceiverCompany(ReceiverCompanyDTO receiverCompany);
}
public class ApplicationService implements ApplicationService{
private final ApplicationsDAO applicationDao;
public ApplicationServiceImpl(final ApplicationsDAO applicationDao) {
this.applicationDao = applicationDao;
}
@Override
public Application getByReceiverCompany(final ReceiverCompanyDTO receiverCompany) {
final Application app = Optional.ofNullable(receiverCompany).map(ReceiverCompanyDTO::getApplication)
.orElse(getDefaultApp());
return app;
}
}
and my test is
class ApplicationServiceSpec extends Specification {
def 'getByReceiverCompany ReceiverCompanyDTO -> application is not null'() {
given:
def application = new GenericApp()
def receiverCompanyDTO = new ReceiverCompanyDTO(
application: application
)
ApplicationService applicationService = new ApplicationServiceImpl( Mock (ApplicationsDAO))
when:
def result= applicationService.getByReceiverCompany(receiverCompanyDTO)
then:
result != null
}
}
always enters through orElse , I don’t know to make for that the variable app to have the value of receiverCompanyDTO
Can we help me with this issue?
Thanks a lot
:point_up: Edit: hello
I have this code to test
always enters through orElse , I don’t know to make for that the variable app to have the value of receiverCompanyDTO
Can we help me with this issue?
Thanks a lot
:point_up: Edit: hello
I have this code to test
Change to Groovy 3.0 on Combo
always enters through orElse , I don’t know to make for that the variable app to have the value of receiverCompanyDTO
Can we help me with this issue?
Thanks a lot
:point_up: Edit: hello
I have this code to test
Switching to Groovy 3.0 on Combo
always enters through orElse , I don’t know to make for that the variable app to have the value of receiverCompanyDTO
Can we help me with this issue?
Thanks a lot
map(ReceiverCompanyDTO::getApplication)
you used a method reference. That is the same pattern as @leonard84 suggested to you.ofNullable
, map
, orElse
are nothing else but simple method calls. Therefore, you need to pass method references or lambdas (or closures in Groovy).orElse
to orElseGet
is explained in this tutorial. Under Java, .orElse(this::getDefaultApp)
would not even compile. Under Groovy, it would, but it would return a closure, and this is not what you need. You want to evaluate the closure or lambda or method reference, but only if necessary. Please also not the performance impact explanation in the tutorial..orElseGet(this::getDefaultApp)
is equivalent to the lambda expression .orElseGet(() -> getDefaultApp())
.throw new Exception();
only compiles under Groovy, not under Java, because it is a checked exception. There, you would have to either declare the exception or throw a RuntimeException
.
orElse(getDefaultApp())
in your application and can change ApplicationServiceImpl.getDefaultApp()
from private
to protected
in order to make it mockable and testable, you could get away with spying on ApplicationServiceImpl
like this in order to avoid the exception: ApplicationService applicationService = Spy(ApplicationServiceImpl, constructorArgs: [Mock(ApplicationsDAO)]) {
getDefaultApp() >> application
}
Hello @leonard84 , @kriegaex
I have reviewed your answers
Thank for your time.