Hallo,
nachdem ich seit einigen Stunden am Probieren bin muss ich einfach das Handtuch werden.
Ich habe mich tot gegooglet, jede ach so tolle Lösung für mein Problem ausprobiert, aber keine einzige funktioniert.
Ich habe hier eine Spring Boot Applikation und möchte einen H2 Test mit dem JHM Benchmark testen.
Dazu habe ich eine Superklasse von der die testenden H2 Tests lediglich erben sollen.:
Der H2 Test soll dann von dieser Klasse erben und bekommt noch die Annotation @State(Scope.Benchmark)
An der Setup Methode verpass ich dem ganzen ein @Setup und an dem Test gibt es ein @Benchmark.
Starte ich dann den Test bekomme ich dieses Problem:
Cannot invoke "de.xxx.xxx.xxx.h2_test_scenario.impl.scenario_builder.H2TestScenarioFactory.createXXXX()" because "this.testScenarioFactory" is null
Ausschnitt aus der H2 Test Klasse:
Wie man sieht, funktioniert das Autowired nicht sobald ich den Test über den JHM Benchmark starte.
Ich habe mich wie bereits erwähnt tot gegoogled und natürlich habe ich auch Ergebnisse erhalten, aber sämtliche Lösungsansätze funktionieren einfach nicht.
Gibt es eine Lösung für das Problem oder funktioniert der JHM zusammen mit Spring Boot nicht?
nachdem ich seit einigen Stunden am Probieren bin muss ich einfach das Handtuch werden.
Ich habe mich tot gegooglet, jede ach so tolle Lösung für mein Problem ausprobiert, aber keine einzige funktioniert.
Ich habe hier eine Spring Boot Applikation und möchte einen H2 Test mit dem JHM Benchmark testen.
Dazu habe ich eine Superklasse von der die testenden H2 Tests lediglich erben sollen.:
Java:
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.util.concurrent.TimeUnit;
import org.junit.Test;
import org.openjdk.jmh.profile.JavaFlightRecorderProfiler;
import org.openjdk.jmh.runner.NoBenchmarksException;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import org.openjdk.jmh.runner.options.TimeValue;
/**
* Basisklasse für die Benutzung der JMH-Benchmarks innerhalb von Tests.<br>
* Besitzt genau eine mit <code>@Test</code> annotierte Methode, welche dann den eigentlichen Benchmark startet. Dies muss so sein, damit der Benchmark<br>
* über JUnit gestartet wird. Die zu prüfenden Methoden in den erbenden Testklassen müssen dann nur mit <code>@Benchmark</code> annotiert werden,<br>
* damit der Runner sie starten kann.<br>
* Solange die erbende Klasse nur mit den JUnit-Testannotationen arbeitet, wird auch kein Benchmark gestartet und es kommt zu keinem unnötigen Overhead.
*
*/
//@State(Scope.Benchmark) in erbender Klasse
public abstract class AbstractBenchmarkHarnessForTests
{
private Options options;
public AbstractBenchmarkHarnessForTests()
{
options = createDefaultOptions();
}
public AbstractBenchmarkHarnessForTests(Options options)
{
this.options = null == options ? createDefaultOptions() : options;
}
@Test
public void createOptionsAndRunBenchmark() throws RunnerException
{
try
{
new Runner(options).run();
}
catch(NoBenchmarksException e)
{
//ignore
}
}
private Options createDefaultOptions()
{
RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
return new OptionsBuilder()
.include(this.getClass().getName() + ".")
.timeUnit(TimeUnit.MILLISECONDS)
.warmupTime(TimeValue.seconds(5L))
.warmupIterations(10)
.measurementTime(TimeValue.milliseconds(1))
.measurementIterations(20)
.threads(1)
.forks(0)
.shouldFailOnError(true)
.shouldDoGC(true)
.addProfiler(JavaFlightRecorderProfiler.class, "")
.detectJvmArgs()
//.result("d:/tools/" + this.getClass().getName() + ".json")
//.resultFormat(ResultFormatType.JSON)
.build();
}
public Options getOptions()
{
return options;
}
public void setOptions(Options options)
{
this.options = options;
}
}
Der H2 Test soll dann von dieser Klasse erben und bekommt noch die Annotation @State(Scope.Benchmark)
An der Setup Methode verpass ich dem ganzen ein @Setup und an dem Test gibt es ein @Benchmark.
Starte ich dann den Test bekomme ich dieses Problem:
Cannot invoke "de.xxx.xxx.xxx.h2_test_scenario.impl.scenario_builder.H2TestScenarioFactory.createXXXX()" because "this.testScenarioFactory" is null
Ausschnitt aus der H2 Test Klasse:
Java:
@ContextConfiguration(classes = {
H2TestScenarioFactory.class,
...
})
@MockBeans({
@MockBean(XXX.class),
...
})
@DataJpaTest(showSql = false)
@State(Scope.Benchmark)
public class CalculationHandlerH2Test2 extends AbstractBenchmarkHarnessForTests
Wie man sieht, funktioniert das Autowired nicht sobald ich den Test über den JHM Benchmark starte.
Ich habe mich wie bereits erwähnt tot gegoogled und natürlich habe ich auch Ergebnisse erhalten, aber sämtliche Lösungsansätze funktionieren einfach nicht.
Gibt es eine Lösung für das Problem oder funktioniert der JHM zusammen mit Spring Boot nicht?