I have a class that constructs some complicated data (imagine a large XML or JSON structure - that sort of thing). Constructing it takes time. So I want to construct it once, and then use that same data in all tests. Currently I basically have a public static
object instance defined in a class that defines main
, and then refer to it explicitly in the tests (code is a very simplified example):
public class Data
{
// This class constructs some complicated data
}
public class TestSet
{
public static final Data PARSE_ME = new Data(...);
public static void main(String[] args) throws RunnerException
{
Options opt = new OptionsBuilder()
.include(".*ParserTest") // several tests
.forks(1)
.build();
new Runner(opt).run();
}
}
@State(Scope.Thread)
public class SomeParserTest
{
@Setup(Level.Iteration)
public void setup()
{
Parser parser = new Parser(TestSet.PARSE_ME);
}
@Benchmark
public void getId()
{
parser.getId(123);
}
}
And this is awful of course... An equally evil option would be creating a separate class just so that it can hold a single static object. It would be nice to use something like
Options opt = new OptionsBuilder()
...
.param(/*my Data object comes here*/)
but param
only accepts Strings, so not sure how would I pass an object (and more importantly: the same instance of the object!) to it.
So is there anything more elegant, than a global object, I described above?
@State
-annotated class is the canonical way to do this sort of thing with JMH. – Surrogate@State(Scope.Benchmark)
), as long as multiple tests can share it. Question is how do I do that? (on top of everything Java does not pass annotations to children, so even if all tests inherited a class with@State
annotation, still would not help – Humblebee