0

I am trying to run junit test cases using VertxUnitRunner.class. I have 35 test cases, each time getting concurrent exception for different test case. I am running these test cases in VM machine with jenkins.

Does any one know a solution for this?

@RunWith(VertxUnitRunner.class)
public class KeyMgmtMainTest {

    private Environment env;

    private String host;

    private int port;


    @Before
    public void init(TestContext context) {

    ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[] { "xyz-abc-servlet.xml" });
    vertx = Vertx.factory.vertx();

    vertx.deployVerticle(new ABC1Verticle(ctx), context.asyncAssertSuccess());
    vertx.deployVerticle(new ABC2VerticleTest(ctx), context.asyncAssertSuccess());
    vertx.deployVerticle(new ABC3ConsumerVerticleTest(ctx), context.asyncAssertSuccess());
    vertx.deployVerticle(new ABC4ConsumerVerticleTest(ctx), context.asyncAssertSuccess());
    env = ctx.getBean(Environment.class);
    port = Integer.parseInt(env.getProperty("http.server.port"));
    host = env.getProperty("cluster.host");

    }

    @Test
    public void testSaveDomain(TestContext context) {
    final Async async = context.async();
    final String token = "Bearer";
    Domain domain = new Domain();
    domain.setDomainName("XXX");
    domain.setTenantId("YYYY.com");
    domain.setCreatedBy("admin");
    domain.setUpdatedBy("admin");
    vertx.createHttpClient().post(port, host, "/my/url/domain").putHeader("Authorization", token)
        .setChunked(true).handler(response -> {
            response.bodyHandler(body -> {
            context.assertEquals(200, response.statusCode());
            JsonObject json = new JsonObject(body.toString());
            json = json.getJsonObject("domain");
            context.assertTrue(json.getLong("domainId") == 1);
            context.assertTrue(json.getString("domainName").equals("Lighting"));
            async.complete();
            });
        }).write(Json.encode(domain)).end();
    }

       @After
    public void tearDown(TestContext context) {
    vertx.close(context.asyncAssertSuccess());
  }

}
Vega
  • 27,856
  • 27
  • 95
  • 103
Rajesh T
  • 11
  • 2
  • It's difficult/impossible to help without the stack trace. Also, a small example showing the problem, without your business code is better. – tsegismont Feb 13 '18 at 11:01
  • Tests run: 31, Failures: 0, Errors: 3, Skipped: 0, Time elapsed: 51.115 sec <<< FAILURE! testGetXXX(com.xxx.xxx.XXXXMainTest) Time elapsed: 4.408 sec <<< ERROR! java.util.concurrent.TimeoutException at io.vertx.ext.unit.impl.TestContextImpl$Step.lambda$run$0(TestContextImpl.java:112) at java.lang.Thread.run(Thread.java:748) testXXX(com.xxxx.xxxx.xxxxxMainTest) Time elapsed: 5.887 sec <<< ERROR! java.util.concurrent.TimeoutException at io.vertx.ext.unit.impl.TestContextImpl$Step.lambda$run$0(TestContextImpl.java:112) at java.lang.Thread.run(Thread.java:748) – Rajesh T Feb 13 '18 at 11:43

2 Answers2

0

Silly mistake I have done.

I have replaced @Before with @BeforeClass where verticls are deployed. @Before method is executed for each test case, So it is deploying verticles every time where deployment should be once.

After change @Before to @BeforeClass it is working fine. no concurrent issue.

Rajesh T
  • 11
  • 2
0

every test case should end with end()

public void testAbout(TestContext context) {
    final Async async = context.async();
        vertx.createHttpClient().get(port, host, "/about", response -> {
            response.handler(body -> {
                context.assertEquals(200, response.statusCode());
                context.assertTrue(body.toString().contains("Hello"));
                async.complete();
            });
        }).end();
}
Rajesh T
  • 11
  • 2