Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Table of Contents
maxLevel2

Is it possible to inject own method implementation using Groovy reflection?

Q: I often see a situation where an easy test can be written but there are several internal methods calls inside the tested methods which need lots of mocked objects to be created. If I could mock those internally called methods that would help me a lot to be really focused on the main issue.

Groovy is a dynamic language so it should be possible. I was trying to do it using metaclass.methodName overriding but unsuccessfully. I don't have access to the TDD4C library source code, so I don't know if the tested class can be edited this way:

Code Block
def script = testRun.getElementScript()
script.methodToBeOverriden = { return "test" }
script.testedMethod()


Code Block
String testedMethod(){
def property = methodToBeOverriden()
if (property == "test"){
//do complicated logic
}


A: You can use spy() on testRun.getElementScript() and mock the method like you would do in Java, e.g.:

Code Block
given:
TestRun testRun = TestRun.builder()
        .buildElementTest(LOGIC_DIR, ELEMENT_NAME)
Script script = spy(testRun.getElementScript())
script.someInternalMethod(any(), any())

when:
def result = script.someTestedMethod()


Beginner's FAQs

I would like to do X rather than this!

No please. https://8thlight.com/blog/uncle-bob/2012/01/11/Flipping-the-Bit.html

We don't have time do do this!

No one has.

Image Added

Really?

Yes.

Image Added

How to explain that this might be useful?

Feel free to use these slides:

View file
nameTDD4C_final.pdf
height250