Skip to content

Commit

Permalink
HermesMock with ClassRule and JUnit 5 Extension (#977)
Browse files Browse the repository at this point in the history
  • Loading branch information
cristaloleg committed Jan 24, 2019
1 parent 91b1f34 commit 73d0013
Show file tree
Hide file tree
Showing 8 changed files with 155 additions and 15 deletions.
1 change: 1 addition & 0 deletions hermes-mock/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ dependencies {
compile group: 'com.jayway.awaitility', name: 'awaitility', version: '1.6.1'
compile group: 'org.apache.avro', name: 'avro', version: versions.avro
compile group: 'tech.allegro.schema.json2avro', name: 'converter', version: versions.json2avro
compile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.3.1'

testCompile project(':hermes-test-helper')
testCompile group: 'org.spockframework', name: 'spock-core', version: versions.spock
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package pl.allegro.tech.hermes.mock;

import org.junit.jupiter.api.extension.AfterAllCallback;
import org.junit.jupiter.api.extension.AfterEachCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.ParameterContext;
import org.junit.jupiter.api.extension.ParameterResolutionException;
import org.junit.jupiter.api.extension.ParameterResolver;

public class HermesMockExtension implements ParameterResolver, AfterAllCallback, AfterEachCallback {

private final HermesMock hermesMock;

public HermesMockExtension(int port) {
this.hermesMock = new HermesMock.Builder().withPort(port).build();
this.hermesMock.start();
}

public HermesMockExtension(HermesMock hermesMock) {
this.hermesMock = hermesMock;
this.hermesMock.start();
}

public HermesMockDefine define() {
return hermesMock.define();
}

public HermesMockExpect expect() {
return hermesMock.expect();
}

public HermesMockQuery query() {
return hermesMock.query();
}

public void resetReceivedRequest() {
hermesMock.resetReceivedRequest();
}

@Override
public void afterAll(ExtensionContext extensionContext) throws Exception {
hermesMock.stop();
}

@Override
public void afterEach(ExtensionContext extensionContext) throws Exception {
hermesMock.resetReceivedRequest();
}

@Override
public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
return parameterContext.getParameter().getType().isAssignableFrom(HermesMock.class);
}

@Override
public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
return hermesMock;
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package pl.allegro.tech.hermes.mock;

import org.junit.rules.MethodRule;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.Statement;

public class HermesMockRule implements MethodRule {
public class HermesMockRule implements MethodRule, TestRule {

private final HermesMock hermesMock;

Expand Down Expand Up @@ -34,11 +36,20 @@ public void resetReceivedRequest() {

@Override
public Statement apply(Statement base, FrameworkMethod method, Object target) {
return runHermesMock(base);
}

@Override
public Statement apply(Statement base, Description description) {
return runHermesMock(base);
}

private Statement runHermesMock(Statement base) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
try {
createInitialContext();
createInitialContext();
base.evaluate();
} finally {
destroyInitialContext();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,27 @@ package pl.allegro.tech.hermes.mock
import com.fasterxml.jackson.databind.ObjectMapper
import org.apache.avro.Schema
import org.apache.avro.reflect.ReflectData
import org.junit.Rule
import org.junit.ClassRule
import pl.allegro.tech.hermes.test.helper.avro.AvroUserSchemaLoader
import pl.allegro.tech.hermes.test.helper.endpoint.HermesPublisher
import spock.lang.Shared
import spock.lang.Specification
import tech.allegro.schema.json2avro.converter.JsonAvroConverter

class HermesMockAvroTest extends Specification {
@Rule
HermesMockRule hermes = new HermesMockRule(56789);
@ClassRule
@Shared
HermesMockRule hermes = new HermesMockRule(56789)

Schema schema = ReflectData.get().getSchema(TestMessage);
Schema schema = ReflectData.get().getSchema(TestMessage)

JsonAvroConverter jsonAvroConverter = new JsonAvroConverter();
JsonAvroConverter jsonAvroConverter = new JsonAvroConverter()

private HermesPublisher publisher = new HermesPublisher("http://localhost:56789");
HermesPublisher publisher = new HermesPublisher("http://localhost:56789")

def setup() {
hermes.resetReceivedRequest()
}

def "should receive an Avro message"() {
given:
Expand Down Expand Up @@ -58,7 +64,7 @@ class HermesMockAvroTest extends Specification {
"value": 0.42
}
'''
def message = new ObjectMapper().readValue(json, HashMap.class);
def message = new ObjectMapper().readValue(json, HashMap.class)
def avro = new JsonAvroConverter().convertToAvro(json.bytes, schema)

when:
Expand All @@ -71,7 +77,7 @@ class HermesMockAvroTest extends Specification {

def "should throw on incorrect Avro schema"() {
given:
def schema = ReflectData.get().getSchema(TestMessage);
def schema = ReflectData.get().getSchema(TestMessage)
def topicName = "my-first-avro-failing-test-topic"
hermes.define().avroTopic(topicName)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package pl.allegro.tech.hermes.mock

import org.junit.jupiter.api.extension.RegisterExtension
import pl.allegro.tech.hermes.test.helper.endpoint.HermesPublisher
import spock.lang.Specification

class HermesMockExtensionTest extends Specification {

@RegisterExtension
HermesMockExtension hermes = new HermesMockExtension(56789)

HermesPublisher publisher = new HermesPublisher("http://localhost:56789")

def 'simple publish-expect test'() {
given:
def topicName = "my-test-topic"
hermes.define().jsonTopic(topicName)

when:
publish(topicName, TestMessage.random().asJson())

then:
hermes.expect().singleMessageOnTopic(topicName)
}

def publish(String topic, String body) {
publisher.publish(topic, body)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package pl.allegro.tech.hermes.mock

import org.junit.Rule
import pl.allegro.tech.hermes.test.helper.endpoint.HermesPublisher
import spock.lang.Specification

class HermesMockRuleTest extends Specification {
@Rule
HermesMockRule hermes = new HermesMockRule(56789)

HermesPublisher publisher = new HermesPublisher("http://localhost:56789")

def 'simple publish-expect test'() {
given:
def topicName = "my-test-topic"
hermes.define().jsonTopic(topicName)

when:
publish(topicName, TestMessage.random().asJson())

then:
hermes.expect().singleMessageOnTopic(topicName)
}

def publish(String topic, String body) {
publisher.publish(topic, body)
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,20 @@
package pl.allegro.tech.hermes.mock

import org.junit.Rule
import org.junit.ClassRule
import pl.allegro.tech.hermes.test.helper.endpoint.HermesPublisher
import spock.lang.Shared
import spock.lang.Specification

class HermesMockTest extends Specification {
@Rule
HermesMockRule hermes = new HermesMockRule(56789);
@ClassRule
@Shared
HermesMockRule hermes = new HermesMockRule(56789)

private HermesPublisher publisher = new HermesPublisher("http://localhost:56789");
HermesPublisher publisher = new HermesPublisher("http://localhost:56789")

def setup() {
hermes.resetReceivedRequest()
}

def "should receive a message"() {
given:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class TestMessage {
}

static TestMessage random() {
return new TestMessage("random", UUID.randomUUID().toString());
return new TestMessage("random", UUID.randomUUID().toString())
}

String asJson() {
Expand Down

0 comments on commit 73d0013

Please sign in to comment.